条款16: 在operator=中对所有数据成员赋值
class base {
public:
base(int initialvalue = 0): x(initialvalue) {}
virtual void print();
private:
int x;
};
void base::print()
{
cout<<"base: x = "<<x<<endl;
}
class derived: public base {
public:
derived(int initialvalue)
: base(initialvalue), y(initialvalue) {}
void print();
derived& operator=(const derived& rhs);
private:
int y;
};
void derived::print()
{
cout<<"derived: y = "<<y<<endl;
}
derived& derived::operator=(const derived& rhs)
{
if(this==&rhs)
return *this;
//base::operator=(rhs);
y = rhs.y;
return *this;
}
int main()
{
base b1;
derived d1(10);
derived d2(20);
d1=d2;
d1.print();
b1 = (base)d1;
b1.print();
system("pause");
return 0;
}
输出:
derived: y = 20
base: x = 10
请按任意键继续. . .
这里讲了一个漏赋值的情况。在derived& derived::operator=里加入吗?别忘了x是私有的,为基类加个
赋值函数?不对,这可以巧妙的运用一个默认的赋值函数。base::operator=(rhs);你不用担心rhs是派生
的对象,在拷贝时会发生问题。在C++的继承上有固定的内存布局,可以无需担心。你可以想像到的编码
为 x=rhs.x;
但是如果说这个赋值运算符是编译器生成的,有写编译器会拒绝对于这种的调用,可以手工试试
static_cast<base&>(*this)=rhs;这样会导致拷贝构造函数的调用。
这代码比较怪异,但要注意这个只是把他引用给转换了,而不是把整个对象进行转换。如果是转换一个对
象那必然要重新生成一个对象。
那么至此我们可以总结出,在对派生类进行赋值时,要注意对基类成员的赋值,接着对本身赋值
但我对它还不是很满意,因为他似乎没有表现出一种连带关系,放的位置不合适
最简洁的方法我还是喜欢放在派声类的拷贝函数中
例: derived(const derived& rhs):base(rhs),y(rhs.y){}
分享到:
相关推荐
条款16: 在operator=中对所有数据成员赋值 条款17: 在operator=中检查给自己赋值的情况 第四章 类和函数:设计与声明条款 条款18: 争取使类的接口完整并且最小 条款19: 分清成员函数,非成员函数和友元函数 条款20: ...
**条款16:在operator=中对所有数据成员赋值** - **目的**: 确保对象状态的一致性。 - **解释**: 赋值操作符`operator=`需要对类的所有数据成员进行赋值操作,以确保对象的状态完全更新。忽略某些成员可能导致对象...
**条款16:在operator=中对所有数据成员赋值** - **背景**:实现赋值操作符时需要对所有数据成员进行赋值。 - **原因**:确保赋值操作符正确执行深拷贝,避免浅拷贝带来的问题。 - **示例**: ```cpp class ...
第11条款:在operator=中处理“自我赋值” 在重载赋值运算符时,需要处理“自我赋值”的情况,以免出现问题。 本笔记总结了Effective C++的第1到第11条款,涵盖了C++语言的多个方面,旨在帮助开发者编写高质量的...
- **条款16:如何将`std::vector`和`std::string`的数据传递给传统API** - 有时需要将STL容器的数据传递给不支持这些容器的传统API。 - 了解如何正确地进行转换非常重要。 - **条款17:使用“交换技巧”来调整...
2. **条款2:总是初始化成员** - 不初始化的成员变量可能导致不可预测的行为,确保在构造函数中对每个成员进行初始化。 3. **条款3:尽量避免使用裸指针** - 裸指针可能会导致内存管理问题,如内存泄漏。优先使用...
#### 条款16:如何将vector和string的数据传给传统的API - **核心概念**:需要将`vector`和`string`的数据转换为传统API接受的格式。 - **应用场景**: - 当与遗留系统交互时,了解如何正确地进行数据转换。 ####...
- **条款16**:介绍如何将`std::vector`和`std::string`的数据传递给传统的API。 - **条款17**:使用“交换技巧”来调整`std::vector`和`std::string`的容量,以减少内存浪费。 - **条款18**:避免使用`std::...
11. **在operator=中处理“自我赋值”**:自我赋值可能导致问题,因此赋值运算符应首先检查左侧对象是否等于右侧对象,以避免不必要的操作。 12. **复制对象时勿忘其每一个成分**:当类含有成员对象时,复制构造...
- **复制对象时勿忘其每一个成分**: 深拷贝确保所有数据成员都被正确复制。 5. **资源管理** - **以对象管理资源**: 使用智能指针或RAII(Resource Acquisition Is Initialization)类来自动管理内存和其他资源。...
- **Item 16: 牢记80-20准则(80-20 RULE)** - 关注20%的关键代码以实现80%的性能提升。 - 识别并优化瓶颈是提高效率的关键。 - **Item 17: 考虑使用LAZY EVALUATION(懒惰计算法)** - 懒惰计算是一种策略,...