Effective C++ 条款12
复制对象时,勿忘其每个成分
作者在本节条款提醒我们,在多重继承的情况下进行copy或者copy assignment 的operator=的编写时,一定要考虑base 类部分数据的初始化后者复制。
对照一下代码:
class Cutsomer
{
……
private:
    string name;
    string telphone;
};
class PriorityCustomer:public Cutsomer
{
public:
    PriorityCustomer()
    {
        cout<<"PriorityCustomer Ctor"<<endl;
    }
    PriorityCustomer(const PriorityCustomer& rhs)
        :priority(rhs.priority)
    {
        cout<<"PriorityCustomer Copy Ctor"<<endl;
    }
    PriorityCustomer& operator=(const PriorityCustomer& rhs)
    {
        cout<<"PriorityCustomer assign operator"<<endl;
        priority=rhs.priority;
        return *this;
    }
private:
    int priority;
};PriorityCustomer中的数据有下面
    int priority;
    string name;
    string telphone;
而真正copy或者copy assignment的时候仅仅处理了int priority; 
我们能够看到上面的代码中忽视了base类部分的数据的处理。这时改动代码例如以下:
PriorityCustomer(const PriorityCustomer& rhs)
        :Cutsomer(rhs),priority(rhs.priority)
    {
        cout<<"PriorityCustomer Copy Ctor"<<endl;
    }
    PriorityCustomer& operator=(const PriorityCustomer& rhs)
    {
        cout<<"PriorityCustomer assign operator"<<endl;
        Cutsomer::operator=(rhs);
        priority=rhs.priority;
        return *this;
    }Effective C++ 条款12的更多相关文章
- Effective C++ -----条款12: 复制对象时勿忘其每一个成分
		Copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”. 不要尝试以某个copying函数实现另一个copying函数.应该将共同机能放进第三个函数中,并由两个cop ... 
- effective c++  条款12 copy all parts of an object
		这经常发生在更改代码的时候,当有自己的copy 赋值函数或者copy 构造函数时,编译器就不会维护这两个函数.导致发生遗忘. 可能出现的场景 class Customer { private: std ... 
- Effective C++ 条款12:复制对象时勿忘其每一个成分
		void logCall(const std::string& funcName); class Customer { public: ... Customer (const Customer ... 
- [More Effective C++]条款22有关返回值优化的验证结果
		(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ... 
- More Effective C++ 条款0,1
		More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ... 
- 《Effective C++ 》学习笔记——条款12
		***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ... 
- Effective C++ 条款11,12  在operator= 中处理“自我赋值”  ||   复制对象时不要忘记每一个成分
		1.潜在的自我赋值 a[i] = a[j]; *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象, ... 
- Effective C++ 条款08:别让异常逃离析构函数
		1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ... 
- Effective C++ -----条款28:避免返回handles指向对象内部成分
		避免返回handles(包括reference.指针.迭代器)指向对象内部.遵守这个条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handle ... 
随机推荐
- Java基础学习总结(59)——30 个java编程技巧
			1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ... 
- HDU 4253 Two Famous Companies
			Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. O ... 
- [cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类
			用CCLabelTTF显示的数字不好看.于是就想到用图片来代理.眼下网上的实现都是把每一个数字做一个CCSprite组合的方式. 可是我想.动态生成纹理的方式.没有就仅仅好自己手动写一个. 头文件 # ... 
- Oracle_角色_权限具体说明
			一.Oracle内置角色connect与resource的权限 grant connect,resource to user; CONNECT角色: --是授予终于用户的典型权利,最主要的 ALT ... 
- 四种GCC内置位运算函数
			int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比方7368(1110011001000)返回4. int __builtin_clz (u ... 
- the process android.process.acore has stopped或the process com.phone。。。。
			模拟器一启动 The process android.process.acore has stopped unexpectedly 今天不知道怎么回事,模拟器一启动就狂报错, 模拟器已经重新安装过了, ... 
- NOIP2017提高组模拟赛5 (总结)
			NOIP2017提高组模拟赛5 (总结) 第一题 最远 奶牛们想建立一个新的城市.它们想建立一条长度为N (1 <= N <= 1,000,000)的 主线大街,然后建立K条 (2 < ... 
- c语言运算符优先级与while循环案例
			sizeof可以获取数据类型的内存中的大小(字节) #include <stdio.h> #include <stdlib.h> // standared 标准 // inpu ... 
- m_Orchestrate learning system---六、善用组件插件的好处是什么
			m_Orchestrate learning system---六.善用组件插件的好处是什么 一.总结 一句话总结: 1.面包屑导航是什么? 知道它是什么自然就知道它怎么用了 2.表格里面的栏目能能点 ... 
- ios上有时候提交按钮点击两次才可以取消输入框软键盘
			ios上有时候提交按钮点击两次才可以取消输入框软键盘,点击第一次软键盘消失,点击第二次输入框页面消失,这样用户体验不好.我的做法是用 touchstart 代替click来处理 反应快,但是有时候会出 ... 
