C++箴言:在operator=中处理自赋值

C++箴言:在operator=中处理自赋值,第1张

C++箴言:在operator=中处理自赋值,第2张

当对象被分配给自身时,会发生自分配:

类小部件{...};

widget w;
...

w = w//分配给自己

这看起来很蠢,但是是合法的,所以你要确定客户会这么做。此外,赋值并不总是容易区分的。举个例子,

a[I]= a[j];//潜在的自我分配

如果I和J有相同的值,这就是自赋值,并且

* px = * py//潜在的自我分配

如果px和py恰好指向同一个东西,那也是自赋值。这些不明显的自赋值是由别名引起的(多个方法引用一个对象)。通常,当引用或指针指向同一类型的多个对象时,对这些引用和指针进行操作的代码需要考虑这些对象可能是相同的。事实上,如果两个对象来自同一个继承系统,即使没有公共声明,它们也是同一类型,因为基类的引用或指针也可以引用或指向派生类类型的对象:

类别基础{...};

类别衍生:public Base {...};

void doSomething(const Base& rb,// rb和*pd实际上可能是
派生的* PD);//相同的对象

如果您遵循第13项和第14项的建议,您应该始终使用对象来管理资源,并且您应该确保那些资源管理对象在被复制时表现良好。如果是这种情况,当你不考虑自复制时,你的赋值操作符也可能是自赋值安全的。但是,如果你试图自己管理资源,不管怎样(如果你写了一个资源管理类,当然要做),你可能会陷入一个在你使用完一个资源之前就意外释放它的陷阱。例如,假设您创建了一个保存指向动态分配位图的指针的类:

类别位图{...};

类小部件{
...
private:
Bitmap * PB;// ptr到堆分配的对象
};

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++箴言:在operator=中处理自赋值

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情