第2章 变量和基本类型
1.如何选择类型:
-当明确知晓数值不可能为负时,选用无符号类型;
-使用int执行整形运算;
-在算术表达式中不使用char和bool,如果使用char要明确指定是signed char还是unsigned char;
-执行浮点数运算选用double。
2.切勿混用带符号类型和无符号类型。
3.建议初始化每一个内置类型的变量。使用未初始化的变量将带来无法预计的后果。
4.建议:当你第一次使用变量时再定义它。
第3章 字符串、变量和数组
1.如果一条表达式中已经有了size()就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。
2.建议:使用C++版本的C标准库头文件。
3.建议:尽量使用标准库类型而非数组
-vector对象能高效增长。因此在定义vector对象时设定其大小没有什么必要,除非所有元素的值都一样。
-如果不清楚元素的确切个数,请使用vector(而非数组)。
-对于大多数应用来说,使用标准库string要比使用C风格字符串更安全、更高效。
4.范围for语句不应改变去其所遍历序列的大小。
//但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
5.关键概念:泛型编程
原来使用C或Java的程序员在转而使用C++语言之后,会对for循环中使用!=而非<进行判断有点儿奇怪。C++程序员习惯性地使用!=,其原因和他们更愿意使用迭代器而非下标的原因一样:因为这种编程风格在标准库提供的所有容器上都有效。
之前已经说过,只有string和vector等一些标准库类型有下标运算符,而并非全都如此。与之类似,所有标准库容器的迭代器都定义了==和!=,但是它们中的大多数都没有定义<运算符。因此,只要我们养成使用迭代器和!=的习惯,就不用太在意用的到底是哪种容器类型。
第4章 表达式
1.以下两条经验准则对书写复合表达式有益:
-拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求;
-如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。
2.养成使用递增递减运算符前置版本的习惯,尽量使用++i而非i++
3.建议:避免强制类型转换。
第5章 语句
1.使用空语句时应加上注释,从而令读这段代码的人知道该语句是有意省略的。
2.switch语句
-一般不要省略case分支最后的break语句。如果没写break语句,最好加一段注释说清楚程序的逻辑。
-为了安全起见,最好在最后一个标签后面也写上break。
-即使不准备在default标签下做任何工作,定义一个default标签也是有用的。其目的在于告诉读者,我们已经考虑到了默认的情况,只是目前什么也没做。
3.尽量不要在程序中使用goto语句。
第6章 函数
1.如果函数无需改变引用形参的值,最好将其声明为常量引用。
2.当使用argv中的实参时,一定要记得可选的实参从argv[1]开始;argv[0]保存程序的名字,而非用户输入。
3.不要返回局部对象的引用或指针。
4.通常,应该在函数声明中指定默认实参,并将该声明放在合适的头文件中。
第7章 类
1.一般来说,如果类相关的非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件内。
2.只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。
在实际中,如果定义了其他构造函数,那么最好也提供一个默认构造函数。
如果类包含有内置类型或者复合类型的成员,则只有当这些成员全都被赋予了类内的初始值时,这个类才适合于使用合成的默认构造函数。
3.构造函数不应该轻易覆盖掉类内的初始值,除非新赋的值与原值不同。如果你不能使用类内初始值,则所有构造函数都应该显式地初始化每个内置类型的成员。
4.和在头文件中定义inline函数的原因一样,inline成员函数也应该与相应的类定义在同一个头文件中。
5.当我们提供一个类内初始值时,必须以符号=或花括号表示。
6.类型名的定义通常出现在类的开始处,这样就能确保所有使用该类型的成员都出现在类名的定义之后。
7.建议养成使用构造函数初始值的习惯,这样能避免某些意想不到的编译错误。
成员的初始化顺序与它们在类的定义中的出现顺序一致——最好令构造函数初始值的顺序与成员声明的顺序保持一致。而且如果可能的话,尽量避免使用某些成员初始化其他成员。
8.声明一个用默认构造函数初始化的对象时,使用
Sales_data obj;
而非
Sales_data obj(); //这是声明了一个函数!
不要加括号!!
9.static关键字只出现在类内部的声明语句中。
【注】整理的是个人认为的书中值得注意的“Note”、“Best practices”等条目,仅供参考。
网友评论