非强制性,但是个好习惯 当使用连锁赋值时很有用 x=y=z=10; class Window { public: Window& operator=(int size) { ... return *this; } } 这个规则适用于 -,+, +=,-= etc…
赋值给自己,听起来有些不可思议,但是却要引起重视,它很容易把自己隐藏起来. 例如 1 a[i]=a[j]; 如果 i, j的值一样? 2 *px=*py; 如果px py指向同一个object 3    rb and pd migh also be a same object. class Base { ... }; class Derived : public Base { ... }; void doSomething(const Base& rb, Derived *pd); 以上表明多种…
比如: Widget& operator=(const Widget& rhs) { ... return* this; } 令赋值(assignment)操作符返回一个reference to *this…
class Widget { public: ... Widget& operator+=(const Widget& rhs) // 返回类型是个reference,指向当前对象 { ... return *this; } Widget& operator=(int rhs) // 此函数夜适用,即使此一操作符的参数类型不符协定 { ... return *this; } } 注意 这只是一个协议,并无强制性. 这个协议适用于所有赋值相关运算. 这份协议被所有内置类型和标准程序库…
令operator=返回一个reference to *this 将operator=返回一个reference是为了什么呢?答案很简单,就是为了实现连锁形式. 什么是连锁形式,如int x,y,z:x=y=z=:这种形式就是连锁形式. 声明一下.这只是个大家一致同意的写法.你也可以不遵守这种写法.可是无论是内置类型还是标准库的类型,都遵循这条规则.为了达到程序的一致性,也是遵守的比较好. 以下是涉及的代码: #include<iostream> using namespace std; cl…
If you want to concatenate assignment like this int x, y, z; x = y = z = 15; The convention is to make the assignment operators return a reference to *this. 11 Handle assignmnet to self in operator = You can easily assign an object to itself without…
条款9 绝不在构造和析构过程中调用virtual函数 记住: ★在构造和析构期间不要调用virtual函数,∵这类调用从不下降至derived class ----------------------------------------------------------------------------------- 一种非正式的说法:在base class构造或者析构期间,virtual函数不是virtual函数,理由: 表面原因:由于base class构造函数的执行早于derived…
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回值的返回方式上,大师Meyers推荐使用表达式[returnT(lhs)+=rhs;]这种使用匿名临时变量的方式,理由是“自古以来未具名对象总是比具名对象更容易被消除”,这种写法将更好地帮助编译器实现返回值优化(ReturnValue Optimization,简写RVO). 针对上述说法,我在两款…
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类型来模拟bool类型.这允许参数类型为int和bool的函数重载,但是这样做的缺陷是,对于内置的比较运算符,其仍返回int类型. f(int);f(bool); f(a < b); // 会调用f(int),但其实用户期望调用f(bool). 但是一旦改用支持bool类型的编译器,情况可能会发生改变…
"自我赋值"发生在对象被赋值给自己时: class Widget { ... }; Widget w; ... w = w; // 赋值给自己 a[i] = a[j]; // 潜在的自我赋值 *px = *py; // 潜在的自我赋值 class Base { ... }; class Derived: public Base { ... }; void doSomething(const Base& rb, Derived* pd); // rb和*pd有可能其实是同一对象…