- 编译器可能会做类型转换
- 切勿混用带符号类型和无符号类型
- C++中初始化和赋值是两个完全不同的操作
- 未初始化的变量含有一个不确定的值
- 作用域是嵌套的
- 全局变量不显示初始化会得到0,局部变量不可以不初始化,全局变量之间不要有初始化关联。
- 不要返回本地变量的地址(本地变量的地址在程序结束后不可控),返回全局变量的或者静态本地变量的地址是安全的。
- extern关键字:让头文件中声明的变量在定义一次后被多个文件使用(使用extern的文件需要有申明)。
- 如果想要在多个文件之间共享const对象,必须在变量前加上extern。
- static关键字:1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
- c++ 复杂就复杂在于它提供了太多的内存模型。或者说是一提供了太多可以放对象的地方,可以放在堆,栈,全局数据区里面。二提供了太多可以访问对象的方式,可以通过变量本身,可以通过指针,和references。3*3 九种组合。java 的对象只能放在堆里面,访问对象的方式只有指针。内存模型更简单。
- references 特点:clean but hidden
- Bindings do not change at runtime , unlike pointers。
- reference 的实现是const指针。个人认为有一点像顶层const。
- 没有reference 的 reference。对reference 的操作就是对其绑定对象的操作。
- 为什么会出现references,可能只是为了少一些*,更加清爽。
- java 的指针不能做计算,c++ 的指针可以做计算 ++等,这是c的特性。c++的引用和java的引用是不同的。
- c++的指针也是对象,可以定义对指针的引用。
- const 动作在编译时刻保证
- 默认状态下,const 对象仅在文件中有效。想要在不同文件中共享需要extern关键字。
- 顶层const 表示指针本身是个常量,底层const 表示指针所指的对象是个常量
- 常量的引用不能用作修改它所绑定的对象,保证不从自己这里去修改对象。
- 引用的类型必须与其引用对象的类型一致(类型不一致,该应用可能会绑定一个临时量而非引用对象,而临时对象是const的,可能会引发错误)
- char * s = "hello,world" ; 该语句中的字符是放在全局数据区的,s[0] = 'b';会造成总线错误。--翁凯
- c++ 的语法允许把const关键字放在成员函数的参数列表之后,此时,紧跟在参数列表后面的const表示this 是一个指向常量的指针。 动作如 const A* const this。
- constexpr 和常量表达式。
- 常量表达式是指值不会改变并且在编译时刻就能得到计算结果的表达式
- c++11规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
- 当引用被作为auto初始值时,真正参与初始化的其实是引用对象的值,auto一般会忽略顶层const,保留底层const。
- decltype 类型指示符,会保留const