1.注释界定符不能嵌套,可参考
cout<<"/*"<<endl;
cout<</*"*/"*<<endl;
cout<</* "*/" /* "/*" */<<endl;
2.读取数量不定的输入数据是,Ctrl_D的作用是停止输入,并且执行程序。
3.当从一个无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须确保结果不能是一个负值。因此在for循环中,一般不使用unsigned,否则会导致死循环。
4.初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值老替代。
初始化的几种形式:int a=0; int a(0); int a={0}; int a{0};
其中int a{0};对于内置类型的变量进行初始化时,会有一个缺陷:如果我们使用初始化列表且初始值存在丢失信息的风险则编译器将报错。
例如:double PI=3.1415; int a{PI};
5.默认初始化,如果是内置类型的变量未被显示初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被默认初始化为0,定义在函数内部的变量的值是未定义的。如果试图拷贝或者以其他形式访问此类值将会引发错误。
6.声明和定义的区别:
声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。
定义负责创建与名字关联的实体。
如果想声明一个变量而非定义它,就在变量名之前添加关键字extern,而不要显式的初始化变量。
在函数体内部,如果试图初始化一个extern关键字标记的变量,将引发错误。
7.c++是一种静态类型语言,其含义是在编译阶段检查类型,其中检查类型的过程称为类型检查,对象的类型决定了对象所能参与的运算。
8.在程序中,若函数内部有和外部有相同名字的变量时,在函数内部局部变量会覆盖全局变量。
9.引用是为对象起了另外一个名字,一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,一旦初始化完成后,引用将和它的初始值对象一直绑定在一起,因为无法令引用重新绑定到另外一个对象,因此引用必须被初始化。引用的初始值必须是一个对象。
引用并非对象,它只是为一个已经存在的对象所起的另外一个名字。
10.指针的值应属于以下4种状态之一:
指向一个对象
指向紧邻对象所占的空间的下一个位置
空指针,意味着指针没有指向任何对象
无效指针,也就是上述情况之外的其他值。
11.void* 的视角来看内存空间只是内存空间,没办法访问内存空间中所存的对象。
12.引用本身不是一个对象,因此不能定义指向引用的指针。但指针是一个对象,所以存在对象指针的引用。
13.面对一条比较复杂的指针或引用语句时,从右向左阅读有助于弄清楚它的真实含义。
14.const常量必须进行初始化,const常量意味着read_only,被初始化后不能被更改。
const常量只是在本文件中使用,若在多个文件中定义同名的常量时,等同于在不同文件中分别定义了独立的变量。
若想在文件之间共享此常量,则应该在声明和定义时加上extern关键字。
15.非const引用不能指向一个const常量。例外的是在初始化常量时允许表达式作为初始化。
double dval=3.14; const int &ri=dval;
此处ri引用了一个int型的数。对ri的操作应该是整数运算,因此为了确保让ri绑定一个整数,编译器把上述代码变成了如下形式:
const int temp=dval; const int &ri=temp;
在这种情况下,ri绑定了一个临时量对象,所谓临时量对象就是当编译器需要一个空间来暂存表达式求值结果时临时创建的一个未命名的对象。
但是当ri不是常量时,就允许对ri赋值,这样就会给改变ri所引用对象的值,因此这样的引用是非法的。
16.所谓的指向常量的指针也没有规定其所指向的对象一定是一个常量,只是仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径去进行改变。
- int const *p1 = &b;//const 在前,定义为常量指针
- int *const p2 = &c;//*在前,定义为指针常量