派生类的赋值运算符也必须处理它的基类成员的赋值(源自effictive c++)
来源:互联网 发布:用英文介绍人工智能 编辑:程序博客网 时间:2024/06/04 19:58
派生类的赋值运算符也必须处理它的基类成员的赋值!看看下面:
class base {
public:
base(int initialvalue = 0): x(initialvalue) {}
private:
int x;
};
class derived: public base {
public:
derived(int initialvalue)
: base(initialvalue), y(initialvalue) {}
derived& operator=(const derived& rhs);
private:
int y;
};
逻辑上说,derived的赋值运算符应该象这样:
// erroneous assignment operator
derived& derived::operator=(const derived& rhs)
{
if (this == &rhs) return *this; // 见条款17
y = rhs.y; // 给derived仅有的
// 数据成员赋值
return *this; // 见条款15
}
不幸的是,它是错误的,因为derived对象的base部分的数据成员x在赋值运算符中未受影响。例如,考虑下面的代码段:
void assignmenttester()
{
derived d1(0); // d1.x = 0, d1.y = 0
derived d2(1); // d2.x = 1, d2.y = 1
d1 = d2; // d1.x = 0, d1.y = 1!
}
请注意d1的base部分没有被赋值操作改变。
// 正确的赋值运算符
derived& derived::operator=(const derived& rhs)
{
if (this == &rhs) return *this;
base::operator=(rhs); // 调用this->base::operator=
y = rhs.y;
return *this;
}
- 派生类的赋值运算符也必须处理它的基类成员的赋值(源自effictive c++)
- 派生类的复制构造函数与赋值运算符
- 基类与派生类的赋值
- C++之派生类的拷贝构造与赋值运算符重载
- C++:类的复制构造函数、赋值运算符
- 基类和派生类对象之间的赋值
- 基类和派生类的赋值规则
- 基类和派生类对象之间的赋值(截断)
- C++基类和派生类的赋值
- C++基类和派生类的赋值
- C++派生类与基类的赋值
- 派生类的对象赋值给基类对象
- C语言的赋值运算符
- 含有指针成员的类的构造函数、拷贝构造函数、赋值运算符
- 含有指针成员时的赋值运算符重载
- C++类的成员初始化 与 赋值
- 类成员变量的赋值与初始化
- C++中类的赋值成员函数
- 系统抖动
- C/C++中 malloc和new区别
- chrome利用NPAPI开发扩展
- Android 应用性能调试
- 生活杂碎(一)
- 派生类的赋值运算符也必须处理它的基类成员的赋值(源自effictive c++)
- if语句
- Android调试程序
- swing 显示边框
- java定时器(不废话,直接讲例子)
- pkg-config的用法
- Android四大组件之 Service
- 项目周报:写OR不写?如何写?
- PJM软件数据结构分析(怎样有效地避免内存泄露)