首页 > 代码库 > C与C++的区别

C与C++的区别

C++与C的区别

      1. 动态分配内存  

          1)C语言   

            a. malloc函数:在内存的动态存储区中分配一个长度为size的连续空间;       void *malloc(unsigned int size);

            b. calloc函数:在内存的动态存储区中分配n个长度为size的连续空间;        void *calloc(unsigned n, unsigned size);

            c. free函数:释放由p所指向的内存区        void free(void *p);   

            d. void指针类型:在将它的值赋给另一指针变量时要进行要进行强制类型转换使之适合于被赋值的变量的类型  

            e. realloc函数  

          2)C++

            a. new:只需指定其数据类型; 与在函数内定义的变量的初始化方式相同       动态创建对象:int *pi=new int;       动态创建数组:int *pia=new int[10];

            b. delete:对于动态创建的对象或数组,必须要显示释放;         释放对象:delete pi;       释放数组:delete [] pia;

            c. 在delete之后,重设指针的值;        delete命令释放了指针所指向对象所占用的内存空间;       在删除指针后,该指针变成悬垂指针;       一旦删除了指针所指向的对象,立即将指针置为0;

            d. 用new创建多维数组

                1)new 类型名T[下标表达式1][下标表达式2]……;

                2)如果内存申请成功,new运算返回一个指向新分配内存的首地址的指针,但不是T类型指针,而是一个指向T类型数组的指针,数组        元素的个数为除最左边一维外各维下标表达式的乘积。

      2. 输入与输出

          1)C语言: printf, scanf   <stdio.h>

          2)C++:cin,cout      <iostream>

      3. 重载:C++中允许对于符号和函数的重载;

          1)重载函数:相同作用域内形参个数或类型不同的函数 ;  

           a. 重载确定的三个步骤:候选函数;选择可行函数;寻找最佳匹配;

           b. 仅当形参是引用或指针时,形参是否为const才有影响;    

               const引用或指针只能传给const对象;      

               非const引用或指针可以传给非const对象,也可以通过类型转换后传给const对象;

          2)重载操作符:具有特殊名称的函数:保留字operator后接所需要定义的操作符符号;

           a. 不能通过连接其他合法符号来创建任何新的操作符;

           b. 重载操作符必须具有至少一个类类型或枚举类型的操作数;

           c. 优先级和结合性是固定的;   

           d. 不再具备短路求值特性,尤其是对逻辑操作&&,||

      4. 引用&:一种复合类型(复合类型是指用其他类型定义的类型);

          a. 非const引用必须用与该引用同类型的对象初始化,定义后不能再指向其他对象。  

          b. "const引用"是指向const对象的引用,可以初始化为不同但相关的类型的对象或者初始化为右值,如字面值常量,定义后不能再指向其他对象。    

      5. inline函数:编译时,将定义为内联函数的函数在程序中每个调用点上“内联的”展开;  

         a. 内联函数应在在头文件中定义;

         b. 与宏替换的区别:宏替换:编译前由预处理程序进行处理,只作简单的字符替换而不做语法检查;         

                                    内联函数:在编译时处理,进行语法检查;    

      6. 作用域操作符与命名空间:一个命名空间是一个作用域;

         a. 命名空间的定义:可以在全局作用域或其他作用域内部定义,但不能在函数或类的内部定义;

               namespace cplusplus_primer{};

         b. 全局命名空间:定义在全局作用域的名字是定义在全局命名空间中的; 

         c. 未命名的命名空间:定义局部于特定文件,从不跨越多个文本文件;  

            未命名的命名空间用于声明局部于文件的实体;

            在C语言中,程序必须将名字声明为static使之局部于一个文件;

         d. 从命名空间外部使用命名空间成员:作用域操作符::  

             1).简化方法:using 声明;using std::cin;      

             2).命名空间别名:namespace primer=cplusplus_primer;      

                 using指示: using namespace std;  (要避免这种用法)     

      7. 变量定义位置:  

          1)C语言:要求变量定义在程序的开始;  

          2)C++:要求在需要用到变量的时候再去定义;

      8. 带缺省值的函数:C++支持给函数定义一些默认值   

      9. 类与对象:C中的结构体类型就相当于C++中的类,结构体相当于C++中的对象

      10. 继承与派生:C++与C最大的区别

      11. 多态性:在一般类中定义的属性和行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为;

           1)面向对象编程所依赖的多态性称为运行时多态性:应用于存在继承关系的类;

           2)泛型编程所依赖的多态性称为编译时多态性或参数式多态性:将程序所处理的对象的类型参数化,使一段程序可以用于处理多种不同类型的对象;

      12. 面向过程和面向对象;

           1)C语言:面向过程,

           2)C++:面向对象;

      13. 模板与泛型编程:

           1)泛型编程:以独立于任何特定类型的方式编写代码;使用泛型编程时,我们需要提供具体程序实例所操纵的类型或值;

           2)函数模板:typedef <typename 标识符>          函数定义

           3)类模板: