1、为了支持分离式编译,将申明和定义区分开来。如果想要只是申明一个变量而非定义它,只要在变量前面加一个 extern ,而且不要给它初始化。初始化意味着定义,抵消了extern的作用。变量只能被定义一次,但是可以别申明很多次。在函数体内部如果初始化一个带有extern关键字的变量,将会报错。
2、引用即别名,引用并非对象,相反的,他只是对象的另一个名字。为引用赋值,实际上就是把值赋给了与引用绑定的对象;获取引用的值,实际上就是获取了与引用绑定的对象的值。因为引用不是一个对象,所以不能定义引用的引用。
3、C++程序最好使用nullptr来初始化指针为空指针,同时尽量避免使用NULL。任何非0指针对应的条件值都是true。如:int *pi = 1; if(pi) if为真。另外指针可以用==来比较是否想等。一般来说*和&定义指针或者引用变量的时候应该和变量名写在一起,如: int *a;
4、默认情况下,const对象尽在文件内有效。const变量在不加修饰的情况下必须要初始化。const的对象的操作中有一种初始化,如果利用一个对象去初始化另一个对象,他们是不是const常量都无所谓的。
1 int i = 20190227; 2 const int ci = i; 3 int ii = ci;
如果const变量的初始值不是一个常量表达式,而我们只想一个文件中定义又想要在不同文件中使用就需要在定义见面加extern关键字。而在申明前面加的作用也同样是为了在不同文件之间共享。所以,如果想要在多个文件之间共享const对象,必须在变量定义的前面加上extern关键字。
常量指针一般这样写:int *const i = &a;
5、类型别名,传统的我们用typedef,比如: typedef double du; 我们就可以用du代替double来使用了,C++11定义了新的关键字using,他跟typedef的作用是一样,也是给类型取个别名 using double du;
6、auto是C++11新引进的关键字跟其他语言的obj、var一样是让编译器自动推断变量类型。当我们需要推断引用常量的类型是我们需要加上const关键字。
1 auto &time = 20190227; //错误,报错 2 const auto &time = 20190227; //正确 3 4 const int time_ = 20190227; 5 auto time_t1 = time_; //类型为int 6 const auto time_t2 = time_; //类型为const int
所以当我们需要推断出一个const的时候,我们需要明确指出。
7、decltype作为C++11新引入的,他也是让编译器自动判断类型,但是不同的是它只是得到类型而不需要它所判断类型的初始值。如:
1 int a = 1; 2 decltype(a) b = 2;//意思是得到了a的类型,而定义了一个变量b 3 4 int &a = 1; 5 decltype(&a) c ;//错误,因为我们得到了引用类型,引用类型必须初始化。 6 decltype(&a) d = 3; //正确
还有一点就是对const,decltype是得到顶层的类型的。如:
1 const int a = 1; 2 const int &b = a; 3 decltype(&b) c //其中c的类型为const int&
最后说一点就是当decltype是双层括号的时候,他的结果永远是引用类型。比如: decltype((a)) b 那么b的类型永远都是引用类型。
8、为了确保各个文件中类的定义一致,类通常被定义到头文件中。