本来的版本是这样的: Widget & Widget::operator=(Widget rhs) { delete pb;//这里可能直接将rhs的pb删除了 pb = new (*rhs.pb); return *this; } 这里的代码完全无法处理自赋值的情况,一般是在operator的真正处理之前加上一个“证同测试”,像下面这样: Widget& Widget::operatpr=(const Widget & rhs) { if(*this == rhs) return…
1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象,当其中一个对象被删,另一个也被删,这会造成不想要的结果. 该怎么办? 比如:   widget& widget:: operator+ (const widget& rhs) {    delete pd;    pd = new bitmap(*rhs.pb);    return *thi…
什么是自我赋值,就是 v = v 这种类型的语句,也许很多人都会说鄙视这种写法,但是如下的写法会不会出现呢? 比如:a[i] = a[j];      // 不巧的是i可能和j相等 *px = *py;     // 也许px和py刚好指向同一个对象呢 上述例子都是隐含的自我赋值. 再举一例: class Bitmap // 位图类 { ... }; class Widget { public: Widget& operator=(const Widget& rhs); private:…
"自我赋值"发生在对象被赋值给自己时: 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有可能其实是同一对象…
已经一年半没有写过博客了,最近发现学过的知识还是需要整理一下,为知笔记,要开始收费了以前写在为知笔记上笔记也会慢慢的转到博客里. 话不多说,进入正题. 考虑考虑以下场景: 当某个对象对自身赋值时,会出现什么现象?? 例子: #include <iostream> class A { private: int *arr; public: A() { arr = new int[256]; } ~A() { delete arr; } const A& operator=(const A…
1.自我赋值,看起来愚蠢,但是却合法.有些自我赋值一眼就可看出来.有些自我赋值是潜在的.比如:a[i] = a[j]; *px = *py; 甚至不同类型的指针,都指向同一个地址,也是自我赋值,这一类自我赋值,很难识别,因此对自我赋值要有一定的防范. 2.对于资源管理类auto_ptr和shared_ptr,自我赋值是安全的.如果自行管理资源,比如Widget中有个Bitmap* pb:copy赋值如下: Widget& Widget::operator=(const Widget& rh…
当涉及到继承时,派生类的赋值运算符也必须处理它的基类成员的赋值!否则,当派生类对象向另一个派生类对象赋值时,只有派生类部分赋值了.看看下面: class base { public: ): x(initialvalue) {} private: int x; }; class derived: public base { public: derived(int initialvalue) : base(initialvalue), y(initialvalue) {} derived& oper…
记住: ★确保当对象自我赋值时operator=有良好行为.有三种方法:比较“来源对象”和“目标对象”的地址.精心周到的语句顺序.以及copy-and-swap技术 ★确定任何函数若操作一个以上对象,而其中多个对象是同一个对象时,其行为仍然正确 ------------------------------------------------------------------------------------ 潜在的自我赋值举例: a[i] = a[j];  //若i和j相同,便是自我赋值 *…
1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: class Widget { ... }; Widget w; ... w = w; // assignment to self. 这看上去是愚蠢的,但这是合法的,所以请放心,客户端是可以这么做的.此外,自身赋值也并不总是很容易的能够被辨别出来.举个例子: a[i] = a[j]; // potential assignment to self 上面的代码在i和j相等的情况下就是自我赋值,同样的,看下面的例子: *px =…
确保当对象自我赋值时operator=有良好行为.其中技术包括比较“来源 对象”和“目标对象”的地址.精心周到的语句顺序.以及copy-and-swap. 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确.…