//---------------------------15/03/29----------------------------

//#9    绝不在构造和析构过程中调头virtual函数

{

/*

1:在构造时调用virtual函数有两个结果

1>如果基类实现了这个函数,就调用基类的函数。

2>基类没有实现这个函数,链接时报错。

原因:

1>基类的构造函数是早于
派生类的构造函数调用的,所以如果virtual函数使用派生类版本的

话,很可能用到未初始化的派生类的成员变量。c++为了不让你走这条危险的路,就会只调用基类的版本

2>根本原因:在调用基类构造函数时,对象类型是base class,所以会调用基类版本。

所以不要在构造函数中调用任何virtual函数。

2:在析构函数中调用vitual函数:

由于派生类的析构函数是先于基类调用的,所以轮到基类的构造函数时,派生类的成员变量依旧呈现

未定义状态。所以c++视它们不存在,在调用基类析构函数时,对象称为一个base class对象。

3:为了在派生类对象创建时,基类中有适当版本的显示信息调用,一个解决办法是由派生类传入一个消息,

再调用non_virtual版本来显示。

*/

}

//#10   令 operator=
返回一个reference to *this

{

/*

关于赋值,c++中可以写成连锁形式:

int x,y,z;

x = y = z = 15;

为了实现这种连锁赋值,赋值操作符必须返回一个reference指向操作符的左侧实参。

*/

class Widget

{

public:

Widget&operator=(const Widget& rhs)

{

...

return *this;

}

};

}

//#11   在operator=中处理自我赋值

{

//看下面的函数

Widget&

Widget::operator=(const Widget& rhs)

{

delete pb;

pb =new Bitmap(*rhs.pb);

return *this;

}

//这样如果是自我赋值,那就先delete了pb,最后pb就指向一个已经删除的对象

//如果让operator=具备异常安全性
往往自动获得自我赋值安全。

Widget& Widget::operator=(const Widget& rhs)

{

Bitmap* pOrig = pb;

pb =new Bitmap(*rhs.pb);

delete pOrig;

return *this;

}

//这么做会有效率问题:如果是自我赋值,那就多做了一次new以及delete;但是考虑到自我赋值的几率

//并不建议在开头加上if判断来判断是否是自己。而且用了if语句,效率会明显下降

//还有种方法是使用swap保证异常安全性

Widget& Widget::operator=(const Widget& rhs)

{

Widget temp(rhs);

swap(temp);

return *this;

}

}

//#12   复制对象时勿忘其每一个成分

{

/*

1:当你自己实现operator=操作时,如果你忘记了一个成员变量的复制,编译器不会警告你

2:当你写自己的operator=或者copy构造函数时应该记得:

1>复制所有的自己的成员变量

2>调用所有base classes内的适当的copying函数。

3:如果发现copy构造函数和copy assignment操作符有相近的代码,消除重复代码的做法是

建立一个init成员函数,供两者调用。(但是考虑到前面的条目,构造函数直接初始化效率会很高,所以

如果相近的代码只是赋值的话,还是多动手的好)

*/

PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)

:Customer(rhs), priority(rhs.priority)

{

...

}

PriorityCustomer&

PriorityCustomer::operator=(const PriorityCustomer& rhs)

{

...;

Customer::operator=(rhs);

prioriy = rhs.priority;

return *this;

}

}

effective c++ 笔记 (9-12)的更多相关文章

  1. [Effective JavaScript 笔记] 第12条:理解变量声明提升

    js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一 ...

  2. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  3. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  4. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  5. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  6. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  7. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  8. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  9. Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

    原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...

  10. Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid

    Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...

随机推荐

  1. python常用模块之-random模块

    random模块顾名思义就是生成随机数的模块. random模块有以下常见方法: 1,打印0-1之间的任意随机浮点数,不能指定区间. print(random.random()) 2,打印随机符点数, ...

  2. TSQL使用ADHOC访问Excle文件

    如题,今天正好碰到这个问题,现将相关知识点记录如下: --开启高级配置功能 reconfigure --开启导入功能 reconfigure --允许在进程中使用ACE.OLEDB.12 --允许使用 ...

  3. 解决VB6.0中不能加载MSCOMCTL.OCX的错误提示

    VB6.0毕竟是很古老的开发工具了,其对所使用的第三方组件依赖性比较强,例如在打开从其它电脑上拿来的VB6.0的软件(系统)的工程文件(源代码)时,经常会遇到"不能加载MSCOMCTL.OC ...

  4. 代理工具--mitmproxy

    #代理工具 mitmproxy 指令:mitmproxy -b ip -p port(代理ip设置为:ip,端口设置为:port) 拦截request: 输入字母“i”(代表Intercept fil ...

  5. 团队作业——Alpha冲刺 10/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:编辑界面返回以及预览的intent实现 明日任务:未能按时间要求完成的失败总结 郭剑南 今日任务:优化图像预处理所有功能的函数代码,尝试与 ...

  6. ab参数详解 – 压力测试

    命令参数:    -n requests     Number of requests to perform    //在测试会话中所执行的请求个数.默认时,仅执行一个请求    -c concurr ...

  7. 启动android monitor报错解决办法

    再这汇总一下这段时间使用android monitor新遇到的问题,特汇总对应问题解决办法如下: 1.确保JDK和Android studio位数相同,比如JDK使用的是64位,studio也要是64 ...

  8. 自带hyper -v 或者 Vmware安装Linux centos

    centos系统存在网盘,链接: https://pan.baidu.com/s/1A5ywyLjIegcftaT_xCvPbA 密码: n6v4 https://blog.csdn.net/nanc ...

  9. CountUp.js用法 让数字动起来的插件

    CountUp.js 无依赖的.轻量级的 JavaScript 类,可以用来快速创建以一种更有趣的动画方式显示数值数据.尽管它的名字叫 countUp,但其实可以在两个方向进行变化,这是根据你传递的 ...

  10. 不要以为字段以transient修饰的话就一定不会被序列化

    1: 先阅读这边文章:http://www.importnew.com/21517.html 2:被transient修饰真的会被序列化吗? 反例:java.util.ArrayList中底层存储数组 ...