C++ Primer已经快读完了,但这本书光读一遍是绝对不行的。至少读两遍,把大部分可操作的习题做一遍,才能记住大部分细节。在这里,我想对C++第一部分——C++基础进行一次非常非常非常简略但结合核心部分的整合,带大家一览C++大略(很浅的那一部分),而不是迷失于细节。
第二章 变量和基本类型
2.1 基本内置类型
1.C++定义了算术类型和空类型。常见的类型有bool, char, short, int, long, long long, float, double, long double, unsigned char, unsigned short, unsigned( int), unsigned long, unsigned long long...
2.类型转换。浮点变整型会丢弃小数点,其他类型转换为bool只会是false或者true,true实质上代表1,false实质上代表0。
3.尽量不要使带符号类型和unsigned类型混合使用,否则容易导致溢出问题(负数被转换为unsigned)。
4.unsigned之间的运算必须要保证结果不能是一个负数,否则会发生环绕现象,使结果变成非常诡异的大数。
5.以0开头的整数代表八进制,其后只接受0,1,2,3,4,5,6,7八种符号,否则会出错;以0x(0X)开头的整数代表十六进制,其后还接受8,9,A,B,C,D,E,F和a,b,c,d,e,f。
2.2 变量
6.std::string是一个库类型,其定义在命名空间std中。string的详细内容在第三章和第九章有详细讲解,在这里先不说了。
7.在初学的时候可能认为初始化和赋值没什么不同,毕竟从表面上看,它们都是“给一个变量一个值”。但实则不然,它们之间的差别其实非常大,尤其是在拷贝控制和动态内存分配等情况下,这两种操作的行为可能完全不同。
8.以int为例,初始化有四种方式:int a=0; int a={0}; int a{0}; int a(0); 它们之间也有差别,在后面这个差别会比较明显。
9.在函数内定义变量但没有指定初值的,变量被默认初始化。此时变量被赋予默认值。默认值到底是什么取决于这个变量的类型,比如对于string,其不接受参数的构造函数(第七章)将其初始化为一个空串(注意,空串不是带一个空格的串,而是什么都没有)。
10.变量命名一般用小写字母,类名一般用大写字母开头,用户定义的标识符不能连续出现两个下划线,也不能以下划线紧连大写字母开头。此外,函数体外的标识符不能以下划线开头。
11.一个名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束。位于全局作用域的变量若为内层同名变量隐藏,可以通过全局作用域“::”来访问:
1 #include <iostream> 2 int a;//外部变量,与int a=0;等价 3 int main() 4 { 5 int a = 1; 6 std::cout << ::a << std::endl;//使用外部变量a,输出0 7 return 0; 8 }
2.3 复合类型
12.复合类型是指基于其他类型定义的类型。在C++中的复合类型中主要的两个就是引用和指针。
对于引用,关键的一点是其相当于给已有变量起了个别名。这样的话也就相当于一种绑定,而不是重新拷贝一个副本;指针的值是一个变量的地址。
2.4 const限定符
13.const分为顶层和底层。顶层const指针代表这个指针的值(不是这个指针的地址,是这个指针指向的变量的地址)不能被改变,也就是说这个指针不能被赋值,但可以让这个指针指向其他合法的对象;底层指针代表这个指针所指的对象不能被改变(准确说,是不能通过这个指针的途径来改变。如果这个指针指向一个非常量,这个非常量当然可以通过其他途径来改变。可以想象成这个底层const很主观地认为他指向的是一个常量,所以自觉遵守规则,不改变他指向的这个值)。
2.5 处理类型
14.auto类型说明符可以用于推断类型。在C++14之后,auto已经几乎处处可用了,包括但不限于函数的返回类型,模板。注意,auto会丢弃顶层属性和引用属性,如果需要通过auto定义顶层或者引用类型,需要通过const auto、auto&或const auto&。
15.decltype类型提示符可以被想象成全真推断。注意,decltype不会计算其内的值,更不会对其内进行操作。比如declytpe(a=1) b;这一语句并不会把1赋给变量a。如果其内是解引用操作,decltype将得到引用类型。原因也很简单,看下面的代码:
int a=1,*b=&a;
*b=2;
这两行代码的第二行相当于把a的值通过指针间接改为2。大家可以想想,第二行的*b只有是引用类型,才能被绑定到a并真正改变a的值。如果*b的类型是值类型,则充其量是a的副本,对其赋值2并不会改变a本身。
另外,如果给变量加上了一层或多层括号,decltype也将得到引用类型。
2.6 自定义数据结构
16.关于自定义数据结构,使用关键字struct和class的区别仅仅在于两点:默认访问权限(第七章)和继承(第十五章)。