该部分是在我通读一遍C++primer之后,按照章节顺序列出了本书中所写需要注意的地方。
基本内置类型
大多数计算机可寻址的最小内存块为字节(byte),1个byte等于8个bit,也就是8位二进制数,而计算机的位数决定了一个字的大小,32位系统中1个字为4个字节,64位系统中1个字就为8个字节
一个int至少和short一样大,一个long至少和int一样大,一个long long至少和long一样大
选择变量类型的经验准则:
- 当明确知晓数值不可能为负时,选无符号类型
- 使用int执行整数运算
- 在算术表达式中不要使用char和bool,只有在存放字符或bool值时才使用它们
- 执行浮点数运算使用double
内置类型之间的转化:
- 当我们把非bool值赋给一个bool时,初始值为0为false,否则为true,反过来同样适用
- 当我们把浮点数赋给整数类型时,只取整数部分,反过来小数部分记为0
- 当我们赋给unsigned类型一个超出它表示范围的值时,结果是初始值对unsigned类型表示数值总数取模后的余数,unsigned char c=-1,c为255
- 当我们给一个带符号类型一个超出它表示范围的数时,结果是未定义的
- 当一条表达式含混用带符号类型和无符号类型时,带符号类型会被转化成无符号类型(切勿混用)
建议:初始化每一个内置类型的变量
变量声明和定义的关系:C++语言支持分离式编译,一个程序可能包含多个文件,则每个文件被独立编译。变量声明规定了变量的类型和名字,定义则申请空间,可能还会有初始值;如果想声明一个变量而非定义它,则在加上extern关键字,且不要显示初始化变量
变量命名规范:
- 标识符要能体现实际含义
- 变量名一般用小写字母
- 自定义类型一般以大写字母开头
- 若有多个单词组成,则单词间要有区分
Note:引用不是对象,只是被绑对象的另外一个名字
Note:默认情况下,const对象只在一个文件内有效(除非extern声明)
const的引用:对常量的引用,不能修改引用所绑定的对象
double dval=3.14;
const int& ri=dval;
//该赋值语句是合法的,因为编译器执行了下述转换过程:
const int temp=dval
const int& ri=temp;
那么考虑下ri不是const常量时为什么是非法的,如果ri只是一个普通的非常量引用,那么编译器会认为肯定是想通过ri来改变dval的值,所以ri不会绑定到一个临时值上
顶层const:该对象本身是个const(对任何数据类型都适用)
底层const:指针所指对象是一个const(与指针或引用等符合类型有关)
Note:指针类型既可以是顶层const也可以是底层const
int i=0
int* const p1=&i 顶层const
const int p2=42 顶层const
const int* p3=&i 底层const
const int *const p3=p2 左边是底层const,右边是顶层const
const int& p=p2 用于声明引用的const都是底层const
对象拷贝时,顶层const可以忽略,底层const却不可以,非常量对象可以拷贝给常量对象,常量对象不能拷贝给非常量对象
常量表达式是指值不会改变,并且在编译阶段就能得到计算结果的表达式
Note:一般来说,只要你认定一个变量是一个常量表达式,那就把它声明为constexpr类型
Note:**如果在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,与指针所指对象无关.
Note:auto类型说明符一般会忽略掉顶层const,保留底层const
const int ci=42
const int& cr=ci
auto b=ci b是一个int
auto c=cr c是一个int(cr是ci的别名,ci是顶层const)
auto e=&ci e是一个指向整数常量的指针,const int* (底层const)
Note:decltype处理顶层const时保留顶层const(包括引用)
int i=0;
int *p=&i
const int ci=0;
const int& cj=ci;
decltype(ci) a; a是const int
decltype(cj) b; b是const int&
decltype(i+5) c; c是int
decltype(*p) d d是int&,表达式内容为解引用得到引用类型
decltype((i)) e e是int&,如果给变量多加一层括号,得到引用
Note:头文件中不应包含using声明,因为头文件可能包含在其它文件,其它文件就在不知情的情况下包含using声明
注意:string对象的每个元素为char类型,字面值可以和string对象相加,但是字面值不能和字面值直接相加
注意:范围for语句中不能改变其遍历序列的大小,vector对象的下标运算可用于访问已存在的元素,但不能用于添加元素
Note:尽量使用标注库类型string,不要使用C风格的字符串(尽管C++支持)