`

条款16: 在operator=中对所有数据成员赋值

阅读更多
条款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){}
1
0
分享到:
评论
1 楼 lin_style 2008-02-01  
为什么编辑器里code 只有java...

相关推荐

    Effective.C++.中文第二版.50条款doc文档.chm

    条款16: 在operator=中对所有数据成员赋值 条款17: 在operator=中检查给自己赋值的情况 第四章 类和函数:设计与声明条款 条款18: 争取使类的接口完整并且最小 条款19: 分清成员函数,非成员函数和友元函数 条款20: ...

    Effective C++

    条款16:在OPERATOR=中对所有数据成员赋值 条款17:在OPERATOR=中检查给自已赋值的情况 3、类和函数:设计与声明 条款18:争取使类的接口完整并且最小 条款19:分清成员函数,非成员函数和友元函数 条款20:避免PUBLIC接口...

    摩托罗拉C++面试题

     如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。 一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的...

    operator=赋值检测学习

    operator=赋值自我检测,小程序,给自己参考学习

    C++ HTTP - Reset32

    这将是一段时间,在此之前,生产准备,但我是饲料中的公共API回感兴趣。最初的目标-------------*熟悉C++(再次)。*支持GET和POST方法。*允许OAuth的1.0认证。建立在Windows* x86和x64。*支持PUT和DELETE方法。* ...

    C++ HTTP Reset32

    C++ HTTP Reset32,HTTP可安装项目,提供大家下载!

    解析c++中的默认operator=操作的详解

    在c++中,如果没有定义operator=操作,编译器会提供一个默认的operator=操作。由于operator=操作和拷贝构造函数的功能类似,都执行拷贝操作。因此,编译器也分提供无用的默认operator=操作和非无用的默认operator=...

    006_OSQP: An Operator Splitting Solver forQuadratic Programs

    006_OSQP: An Operator Splitting Solver forQuadratic Programs osqp原理推到及实现文档

    Effective C++(第三版)

    条款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"解决办法

    主要介绍了shell脚本报错:"[: =: unary operator expected"解决办法的相关资料,需要的朋友可以参考下

    Effective C++ 中文版

    条款11:在Operator=中处理“自我赋值” 条款12:复制对象时勿忘其每一个成分 3.资源管理 条款13:以对象管理资源 条款14:在资源管理类中小心Coping行为 条款15:在资源管理类中提供对原始资源的访问 条款16...

    shell脚本报错:”[: =: unary operator expected”解决办法

    shell脚本报错:”[: =: unary operator expected”解决办法  在匹配字符串相等时,我用了类似这样的语句: if [ $STATUS == OK ]; then echo OK fi  在运行时出现了 [: =: unary operator expected 的错误,就...

    Effective C++条款12:构造/析构/赋值运算之(复制对象时勿忘其每一个成份)

    我们在前面文章已经介绍了,如果类没有手动声明拷贝构造函数或拷贝赋值运算符,那么编译器会为我们自动生成这两个成员,并且它们的行为是:将被拷贝的对象的所有成员做一份拷贝 二、复制对象时确保复制所有成员 下面...

    C++ 赋值构造函数注意点介绍

    您可能感兴趣的文章:浅谈c++构造函数问题,初始化和赋值问题详解C++ 拷贝构造函数和赋值运算符详解C++中对构造函数和赋值运算符的复制和移动操作C++中复制构造函数和重载赋值操作符总结深入C++中构造函数、拷贝构造...

    重载赋值运算符

    赋值运算符重载用于对象数据的复制  operator= 必须重载为成员函数 重载函数原型为:  类型 & 类名 :: operator= ( const 类名 & ) ; 案例:完善Name类,支持=号操作。     具体看如下代码: #define _...

    effective stl 中文 pdf

    条款16: 如何将vector和string的数据传给传统的API 条款17: 用“交换技巧”来修正过度的容量 条款18: 避免使用vector 关联容器 条款19: 了解相等和等价的区别 条款20: 为包含指针的关联容器指定比较类型 条款...

    错误:unexpected operator.docx

    错误:unexpected operator.docx

    effective stl stl 技巧

    条款16:如何将vector和string的数据传给传统的API 条款17:使用“交换技巧”来修整过剩容量 条款18:避免使用vector 关联容器 条款19:了解相等和等价的区别 条款20:为指针的关联容器指定比较类型 条款21:...

    Effictive STL CHM中文版

    条款16: 如何将vector和string的数据传给传统的API 条款17: 用“交换技巧”来修正过度的容量 条款18: 避免使用vector&lt;bool&gt; 关联容器 条款19: 了解相等和等价的区别 条款20: 为包含指针的关联容器指定比较类型 ...

    为什么operator=操作符返回引用.docx

    为什么operator=操作符返回引用

Global site tag (gtag.js) - Google Analytics