effective c++ 笔记 (9-12)
//---------------------------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)的更多相关文章
- [Effective JavaScript 笔记] 第12条:理解变量声明提升
js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一 ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- java effective 读书笔记
java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...
- Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid
Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...
随机推荐
- winform调用jar包
因为工作需要,需要做一个数据上传的程序,客户规定的是:数据接口采用http连接,采用JSON-RPC轻量级远程调用协议.所以决定用winform做一个管理界面(其中还包括其他的功能),java完成数据 ...
- SELECT查询结果集INSERT到数据表
简介 将查询语句查询的结果集作为数据插入到数据表中. 一.通过INSERT SELECT语句形式向表中添加数据 例如,创建一张新表AddressList来存储班级学生的通讯录信息,然后这些信息恰好存在 ...
- sshpass 绕过ssh 密码交互式验证
经常我们使用脚本登入服务器的时候,如果使用ssh 命令,经常会提示密码输入,我们不得不手动输入密码,因为ssh 没有 密码的选项. 为了能绕过交互式验证,我们使用sshpass命令解决这个问题: 1. ...
- tplink-ssh登录
同步发表:https://www.eatm.app/archives/395.html 备份配置信息 开启SSH #修改文件userconfig/etc/config/dropbear, #查看opt ...
- C#中单问号(?)和双问号(??)的用法整理
1.单问号(?) 1.1 表示Nullable类型 C#2.0里面实现了Nullable数据类型 //A.比如下面一句,直接定义int为null是错误的,错误提示为无法将null转化成int,因为后者 ...
- VS2017C++单元测试
0.欢迎食用 希望对点进来的你有所帮助. 全文记流水账,内心想法如示例项目名称. 1.建立需测试的项目 新建项目 正常书写.h 和.cpp文件 2.新建单元测试 右击解决方案 -> 添加 -&g ...
- 2019 Web开发学习路线图
以下 Web 开发人员学习路线图是来自 Github developer-roadmap 项目,目前已经有繁体版翻译 developer-roadmap-chinese. 主要有三个方向,分别为前端开 ...
- 谁对EXTJS熟悉,有关关闭panel的问题?
谁对EXTJS熟悉,有关关闭panel的问题?比如:我在A.js 中写了一个 var win = new Ext.Window( { b.js }); win.show(); 打开了一 ...
- NOI 2018网络同步赛(游记?)
刚中考完那段时间比较无聊,报名了一个同步赛,报完名才发现成绩单是要挂到网上的,而且因为报的早给了一个很靠前的考号...那布星啊,赶紧学点东西,于是在一周内学了网络流,Treap以及一些数论. Day1 ...
- BZOJ1007:[HNOI2008]水平可见直线(计算几何)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...