条款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=中对所有数据成员赋值 条款17:在OPERATOR=中检查给自已赋值的情况 3、类和函数:设计与声明 条款18:争取使类的接口完整并且最小 条款19:分清成员函数,非成员函数和友元函数 条款20:避免PUBLIC接口...
如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。 一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的...
operator=赋值自我检测,小程序,给自己参考学习
这将是一段时间,在此之前,生产准备,但我是饲料中的公共API回感兴趣。最初的目标-------------*熟悉C++(再次)。*支持GET和POST方法。*允许OAuth的1.0认证。建立在Windows* x86和x64。*支持PUT和DELETE方法。* ...
C++ HTTP Reset32,HTTP可安装项目,提供大家下载!
在c++中,如果没有定义operator=操作,编译器会提供一个默认的operator=操作。由于operator=操作和拷贝构造函数的功能类似,都执行拷贝操作。因此,编译器也分提供无用的默认operator=操作和非无用的默认operator=...
006_OSQP: An Operator Splitting Solver forQuadratic Programs osqp原理推到及实现文档
条款16:成对使用new和delete时要采取相同形式 use the same form in corresponding uses of new and delete. 条款17:以独立语句将newed对象置入智能指针 store newed objects in smart pointers in standalone ...
主要介绍了shell脚本报错:"[: =: unary operator expected"解决办法的相关资料,需要的朋友可以参考下
条款11:在Operator=中处理“自我赋值” 条款12:复制对象时勿忘其每一个成分 3.资源管理 条款13:以对象管理资源 条款14:在资源管理类中小心Coping行为 条款15:在资源管理类中提供对原始资源的访问 条款16...
shell脚本报错:”[: =: unary operator expected”解决办法 在匹配字符串相等时,我用了类似这样的语句: if [ $STATUS == OK ]; then echo OK fi 在运行时出现了 [: =: unary operator expected 的错误,就...
我们在前面文章已经介绍了,如果类没有手动声明拷贝构造函数或拷贝赋值运算符,那么编译器会为我们自动生成这两个成员,并且它们的行为是:将被拷贝的对象的所有成员做一份拷贝 二、复制对象时确保复制所有成员 下面...
您可能感兴趣的文章:浅谈c++构造函数问题,初始化和赋值问题详解C++ 拷贝构造函数和赋值运算符详解C++中对构造函数和赋值运算符的复制和移动操作C++中复制构造函数和重载赋值操作符总结深入C++中构造函数、拷贝构造...
赋值运算符重载用于对象数据的复制 operator= 必须重载为成员函数 重载函数原型为: 类型 & 类名 :: operator= ( const 类名 & ) ; 案例:完善Name类,支持=号操作。 具体看如下代码: #define _...
条款16: 如何将vector和string的数据传给传统的API 条款17: 用“交换技巧”来修正过度的容量 条款18: 避免使用vector 关联容器 条款19: 了解相等和等价的区别 条款20: 为包含指针的关联容器指定比较类型 条款...
错误:unexpected operator.docx
条款16:如何将vector和string的数据传给传统的API 条款17:使用“交换技巧”来修整过剩容量 条款18:避免使用vector 关联容器 条款19:了解相等和等价的区别 条款20:为指针的关联容器指定比较类型 条款21:...
条款16: 如何将vector和string的数据传给传统的API 条款17: 用“交换技巧”来修正过度的容量 条款18: 避免使用vector<bool> 关联容器 条款19: 了解相等和等价的区别 条款20: 为包含指针的关联容器指定比较类型 ...
为什么operator=操作符返回引用