这篇文章主要是对C++Primer(5th edition)开头部分(第一章、第二章)一些有意思的内容的探讨。
1.c++的注释/**/遵守“最近配对”的规则,C++ Primer(5th edition)上有一个蛮有意思的例子:
#include<iostream>
using namespace std;
int main(){
cout<<"/*"<<endl;
cout<<"*/"<<endl;
cout<</*"*/"*/<<endl;
cout<</*"*/"/*"/*"*/<<endl;
}
可以说明这个问题,其中第六行是错的。
2.for 循环和while循环没有本质区别,效率上也没有孰优孰劣。
3.endl不只是换行那么简单,它还可以刷新buffer(数据缓冲区),这样就能保证写入流中的数据可以全部输出,相比之下,\n只能换行,不能刷新缓冲区。
4.申明和定义不是一回事。例如:
extern int a;//declaration
int a;//defination
在函数内部对被extern标记的变量赋值会导致错误。
5.变量的作用域(scope)也遵守最近配对的规则。
6.引用不是对象!所以没有“引用的引用”这种说法。(所谓对象指的是类的实体)
7.指针和引用的基本区别在于:指针本身是一个对象,在其生命周期内允许指向其他值;申明指针可以不初始化(虽然很不安全!),但引用必须要初始化。
8.C++11引入了nullptr,那么nullptr,NULL,0有什么区别?
答:C++03对0做了特殊规定:0既可以表示整数,又可以表示空指针常量(null pointer constant),这种二义性会带来一些问题(比如函数重载)。而NULL其实是宏定义的void *指针,C++禁止了void *指针向其他类型的隐式转换,所以NULL其实是宏定义的0。nullptr是C++11为了填这些坑引入的,用来表示“不指向任何对象的指针”,这样void *就可以被理解成“指向未知类型的指针”,而0就是0。