effective c++ 第二部分(构造析构赋值运算)
2016-11-18 08:56
183 查看
编译器默认为类生成:构造、析构(非虚)、拷贝构造(浅)、拷贝赋值(浅)
1:
构造函数。
成员初始化列表
初始化列表带上基类,传递参数,不然会用默认的构造函数构造基类。
2:
析构函数
1)pure需要定义,因为会被调用,(建议不pure)
2)别让异常逃离。
3) 一般来说,带有虚函数的类,都需要虚析构函数(如果明确不是做基类,那就没必要虚析构函数)
带虚函数,类大小会大一个指针大小。
【1/2 注意】
别在构造、析构中调用虚函数(如:派生类构造时,基类调用虚函数,按理和实际不现实)
base构造期间,虚函数不是虚函数。(派生类的函数还没放到虚函数表中。况且,逻辑上也不能访问未构造的成员)
3:
拷贝构造函数
Base(const Base &obj);
4:
拷贝赋值运算符
1)返回 reference to *this 应对 连续赋值
2)析构与构造的结合体。
3)处理自我赋值
如:
class Widget
{
...
private:
Bitmap *m_pb;
}
(1)
Widget &Widget::operator=(const Widget &rhs)
{
if (this == &rhs) return *this;
delete m_pb;
m_pb = new Bitmap(*rhs.m_pb);
return *this;
}
(2)如果new 有异常,那么m_pb就指向了被删除的内存。
Widget &Widget::operator=(const Widget &rhs)
{
// 可以没有证同测试,自己估计“自我赋值发生的概率”,可以加上
Bitmap *pOld = m_pb;
m_pb = new Bitmap(*rhs.m_pb);
delete pOld;
return *this;
}
(3)保证异常安全且自我赋值安全
Widget &Widget::operator=(const Widget &rhs)
{
Widget oTmp(rhs);
swap(oTmp);
return *this;
}
注:操作一个以上对象:自我赋值的考虑
【3/4 注意】
1)拷贝构造与赋值运算符不能互调。
拷贝构造
{
赋值(赋值只作用于已初始化的对象)
}
赋值
{
拷贝(构造一个已存在的对象,没有语法支持)
}
2)抑制拷贝方法:1.定义自己的 2.基类私有且不实现(如Uncopyable)
3)赋值对象时勿忘每一个成分(包括派生类要 手动赋值基类的部分Base::operator=(rhs))
备用:
5:虚:重载、覆盖、隐藏
virtual/ 同参
1:
构造函数。
成员初始化列表
初始化列表带上基类,传递参数,不然会用默认的构造函数构造基类。
2:
析构函数
1)pure需要定义,因为会被调用,(建议不pure)
2)别让异常逃离。
3) 一般来说,带有虚函数的类,都需要虚析构函数(如果明确不是做基类,那就没必要虚析构函数)
带虚函数,类大小会大一个指针大小。
【1/2 注意】
别在构造、析构中调用虚函数(如:派生类构造时,基类调用虚函数,按理和实际不现实)
base构造期间,虚函数不是虚函数。(派生类的函数还没放到虚函数表中。况且,逻辑上也不能访问未构造的成员)
3:
拷贝构造函数
Base(const Base &obj);
4:
拷贝赋值运算符
1)返回 reference to *this 应对 连续赋值
2)析构与构造的结合体。
3)处理自我赋值
如:
class Widget
{
...
private:
Bitmap *m_pb;
}
(1)
Widget &Widget::operator=(const Widget &rhs)
{
if (this == &rhs) return *this;
delete m_pb;
m_pb = new Bitmap(*rhs.m_pb);
return *this;
}
(2)如果new 有异常,那么m_pb就指向了被删除的内存。
Widget &Widget::operator=(const Widget &rhs)
{
// 可以没有证同测试,自己估计“自我赋值发生的概率”,可以加上
Bitmap *pOld = m_pb;
m_pb = new Bitmap(*rhs.m_pb);
delete pOld;
return *this;
}
(3)保证异常安全且自我赋值安全
Widget &Widget::operator=(const Widget &rhs)
{
Widget oTmp(rhs);
swap(oTmp);
return *this;
}
注:操作一个以上对象:自我赋值的考虑
【3/4 注意】
1)拷贝构造与赋值运算符不能互调。
拷贝构造
{
赋值(赋值只作用于已初始化的对象)
}
赋值
{
拷贝(构造一个已存在的对象,没有语法支持)
}
2)抑制拷贝方法:1.定义自己的 2.基类私有且不实现(如Uncopyable)
3)赋值对象时勿忘每一个成分(包括派生类要 手动赋值基类的部分Base::operator=(rhs))
备用:
5:虚:重载、覆盖、隐藏
virtual/ 同参
相关文章推荐
- Effective C++ 笔记 第二部分 构造/析构/赋值运算
- 《Effective C++》读书笔记(三) 构造/析构/赋值运算 (第二部分)
- Effective C++读书笔记 第二部分 构造/析构/赋值运算
- 第二部分 类型和运算
- Effective C++ -- 构造析构赋值运算
- Effective C++ 精要(第二部分:构造、析构和赋值)
- 《Effective C++》读书笔记(六) 设计与声明(第二部分)
- (基于Java)编写编译器和解释器-第9章:解析声明-第二部分(连载)
- 视口(viewport)原理详解之第二部分(移动端浏览器)
- DB2 开发系列 第二部分 数据库的创建
- 【C++探索之旅】第二部分第一课:面向对象初探,string的惊天内幕
- ListView.OnScrollListener监听listview滚到最底部,实现分页加载(本文第一部分转载,第二部分原创)
- 第17章 高级数据表示 17.7 二叉搜索树(第二部分 二叉树分步实现)
- COM编程入门:第二部分——深入COM服务器
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 2(Big Number)
- 第二部分: spring4.x的新特性
- Struts 2与AJAX(第二部分)
- 【转】常见Java面试题 – 第二部分:equals与==
- 【C语言探索之旅】 第二部分第七课:文件读写
- VBScript常用函数(asp)第二部分