含非静态常量数据成员的类的赋值运算符重载

时间:2008-05-29 15:36:44   来源:论坛整理  作者:  编辑:chinaitzhe
对一个含有非静态的常量数据成员的类来说,赋值运算符应该怎么实现呢?要求左值的常量在赋值之后要和右值相等,如下面的例子:

Class Sth{
public:
const int posX, posY;
//..............................
Sth(const int pX, const int pY): posX(pX), posY(pY){
//...............................
}
Sth(const Sth& ref): posX(ref.posX), posY(ref.posY){
//...............................
}
Sth& operator=(const Sth& ref){
//这里该怎么办?直接赋值是铁定不行的,能利用拷贝构造器来实现吗?
}
//..................................
}
网友回复:memcpy((void*)&posX, &ref.posX, sizeof(int))
网友回复:常量对类得每个类不一样?假如一样自然不需要考虑他们

网友回复:假如每个实例都不一样,设置成常量不是很合适,至少要mutable

网友回复:是常量了怎么赋值?
网友回复:主要是希望保证在实例的生命周期里这些值都是不变的。假如不用常量有别的办法吗?
网友回复:Oh yeah! 用Placement new配合拷贝构造器搞定了!

Sth& operator=(const Sth& ref){
this->~Sth();
return *(new(this) Sth(ref));
}

另,实测中发现传说的Placement new产生的对象不会自动调用析构器现象没有发生,不管是在堆上还是在栈上,都会在delete或是离开生存域时自动调用析构器。
网友回复:忘了说了,编译器是 GCC 4.2.11

为什么不能改自己的帖?郁闷…………
关键字:静态,常量,数据,成员,赋值,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面