Effective C++学习笔记 chapter 2
2016-05-12 13:34
435 查看
1.如果不想对象有默认的拷贝构造函数和拷贝赋值函数,可以在对象中声明这两个函数而不去实现他们
更好的做法:
class Uncopyable
{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable);
};
class HomeForSale : private Uncopyable
{
};
上述是以private方式进行继承的
2.为多态基类声明virtual析构函数
1)带有多态性质的基类应该声明一个virtual析构函数;如果类带有任何virtual函数,它就应该拥有一个virtual析构函数
2)class的设计目的如果不是为了作为基类使用,或者不是为了具备多态性,就不该声明virtual析构函数(会增加类的大小)
3.别让异常逃离析构函数
1)析构函数绝对不要吐出异常,如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下他们或结束程序
2)如果客户需要对某个操作函数运行期间抛出的异常做出反应,难么该类应该提供一个普通函数(而非在析构函数中)执行该操作
4.绝对不要在构造和析构过程中调用virtual函数
解释:在base构造期间,virtual函数不是virtual函数
5.令operator=返回一个reference to *this
6.在operator=中处理自我赋值
1)
Widget& Widget::operator=(const Widget &rhs)
{
Bitmap *pOrig = pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
2) copy and swap技术
Widget& Widget::operator=(const Widget &rhs)
{
Widget temp(rhs);
swap(temp); //将this数据和上述复件的数据交换
return *this;
}
7. 赋值对象时勿忘其每一个成分
当你编写一个copying函数时,请确保1)复制所有的local成员变量2)调用所有base classes内的适当的copying函数
更好的做法:
class Uncopyable
{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable);
};
class HomeForSale : private Uncopyable
{
};
上述是以private方式进行继承的
2.为多态基类声明virtual析构函数
1)带有多态性质的基类应该声明一个virtual析构函数;如果类带有任何virtual函数,它就应该拥有一个virtual析构函数
2)class的设计目的如果不是为了作为基类使用,或者不是为了具备多态性,就不该声明virtual析构函数(会增加类的大小)
3.别让异常逃离析构函数
1)析构函数绝对不要吐出异常,如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下他们或结束程序
2)如果客户需要对某个操作函数运行期间抛出的异常做出反应,难么该类应该提供一个普通函数(而非在析构函数中)执行该操作
4.绝对不要在构造和析构过程中调用virtual函数
解释:在base构造期间,virtual函数不是virtual函数
5.令operator=返回一个reference to *this
6.在operator=中处理自我赋值
1)
Widget& Widget::operator=(const Widget &rhs)
{
Bitmap *pOrig = pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
2) copy and swap技术
Widget& Widget::operator=(const Widget &rhs)
{
Widget temp(rhs);
swap(temp); //将this数据和上述复件的数据交换
return *this;
}
7. 赋值对象时勿忘其每一个成分
当你编写一个copying函数时,请确保1)复制所有的local成员变量2)调用所有base classes内的适当的copying函数
相关文章推荐
- C++第5次上机作业
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- C语言版本--工资管理系统
- c语言大杀器——指针详解
- c++第五次作业
- Qml和C++开发的学生信息管理软件一
- 启动C++test时报错“an error has occurred, null”
- C语言单链表和双链表的创建和输出
- C++ 为什么要使用指针(需要再总结一下)
- C++指针详解
- c++ STL 之map 和 pair
- c++ out_of_range
- HDU 2516-取石子游戏(斐波那契博弈)
- c++中冒号(:)和双冒号(::)的用法
- c语言之内存的申请malloc() 和释放free()
- RSA算法C语言实现
- C/C++中typedef的使用
- C语言中malloc()和calloc()c函数用法
- 在C++中使用TinyXML2解析xml
- C++ 指针