阅读《Effective c++》第三版笔记 day 1

发布时间 2023-12-02 00:28:47作者: 雨和风

阅读《Effective c++》第三版 day 1


·容易区别的 copy 构造和 copy 赋值,如果一个新对象被定义,则一定会被某个构造函数调用,不可能做调用赋值操作,如果新对象没有被定义,则不会有构造函数被调用,会被当成赋值操作。

bool hasAccpetTableQuality(Widget w);
...
Widget aWidget;
if(hasAccpetTableQuality(aWidget))...
这段代码中,进行了 **pass by value **,将aWidget复制到了w体内,复制动作由copy构造完成。

· 被讨厌的#define,用 const,enum,inline 来替换

#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a):(b))
int a = 5,b = 0;
CALL_WITH_MAX(++a,b);		//a累加两次
CALL_WITH_MAX(++a,b+10);	//a累加一次
这是很奇怪的现象,对于C++编程人员来说不确定而又奇怪的事事不允许发生的。此外宏定义不可以被用与类当中,而且在预编译时,可能没被感知到,编译器不知道其他文件中被宏定义的变量是啥。

·更多的选择 const

特定的变量不想被修改?那就选择 const。想告诉其他人别在自己写好类成员函数内部做”动作“?选择 const 修饰成员函数!

当然,如果要在 const 成员函数内做一些变量的赋值,那可以在变量声明时(声明肯定不能在 const 函数内),为变量添加 mutable 关键字。

通常对于返回型的成员函数要写出 const 版本和非 const 版本,但代码重复是一件不怎么好的事。既然如此,就只将 const 版本的返回型成员函数完全实现好,非 const 版本的返回型成员函数实现可以只需使用 const_cast< type >( ) 关键字把常量性转除后用以 return 即可,有一点要知道,再使用 const_cast< type >()转除前,要将传入的对象转成 const 型的,因为要明确调用的是const类型的返回成员函数,而不是自身。

为什么不是 const 版本的调用 非 const 版本的呢。如果这样做的话,会不会显得我们不够守信呢,你需要做的是 在 const 版本的函数内将 *this 身上的 const性质解除,然后再做 return 。可 const 版本本意就是告诉别人不要在此做修改,如此调用非 const 版本就不正是要对其做修改了么。