基础
1. 数据类型差异 1.1 原始类型增强 const类型: C语言的全局常量为默认外部链接, C++默认为内部链接(static). C语言的常量是可以寻址, C++常量是不可以寻址(编译期符号表维护) 运行期对const常量进行初始化的, const常量能进行寻址, 修改内存值影响常量值 e.g. 使用变量进行初始化const int a=b; 结构体常量const T a ={val1,val2…} 对全局const常量声明为外部扩展时, const常量能进行寻址, 修改内存值影响常量值. e.g. extern const int a =100 ; 对const常量取地址(取地址, 引用定义), 会提供临时内存地址. 修改内存值不影响常量值 e.g. const int a =100; int* ptr = &a; struct类型: C语言使用结构体时必须加上struct关键字, C++可加可不加. C语言结构体内不能定义函数, C++结构体内不仅可以定义函数, 还可以定义命名空间 1.2 新增类型 class类型: class是c++面向对象特性的重要实现. bool类型: C语言需要使用bool.h来实现bool数据类型, C++原生支持bool类型占用一个字节大小 引用类型: 引用即被引用对象本身, 内部由指针实现, 所以它的占用和指针一致. 左值引用: 即左值对象的引用, 语法 Type &A = B 左值往往是变量, 左值引用的用法和原变量完全一致, 所以左值引用相当于变量别名 非常量左值引用不能引常量左值, 有背常量不可变规则. 常量左值可以引用引右值, 创建临时空间进行引用, 非常量左值引用不能引右值 右值引用: 即右值对象的引用, 语法Type &&A=B 右值往往是临时对象, 右值引用的用法和临时对象完全一致, 所以右值引用相当于延长临时变量的生命周期. 非常量右值引用不能引常量右值, 有背常量不可变规则. 右值引用不能引左值 链式编程: 如果函数的返回值是引用, 那么这个函数可以作为左值, 实现链式编程. 例如: person & test(){ return *this} ; p.test().test().test(); 返回值为对象, 就可以再调用它的成员. 2. 表达式差异 三目运算符增强: C语言的三目运算符返回右值, C++的三目运算符返回左值 自增自减运算符增强: C语言中++a返回右值, C++中++a返回左值 指针转换增强: C语言的指针存在隐式类型转换风险, C++指针必须强制类型转换 3. 新增特性 namespace关键字: namespace相当于一个新的作用域, 支持在里边定义变量、函数和结构体, 或者嵌套另一个namespace 语法: namespace spaceID{…} 作用域选择: 域::对象, 域缺省为全局范围, 就近原则被排除; 域可以是namespace、class、struct 注意事项: 注意命名空间是开放的, 同名命名空间会合并元素. 无名空间元素,退化成静态(static)全局变量,只能给本文件使用 别名语法: namespace A = B ;一般很少人会使用 using关键字: new关键字: