条款6:若不想使用编译器自动生成的函数,就该明确拒绝
2014-08-19 17:20
239 查看
(一)阻止copy构造函数和copy assignment操作符。有两种方法
第一种:把复制构造函数和赋值操作符在private中声明(不要定义,定以后,member函数和friend函数还是能访问到的)。
如果我们能把连接错误提前到编译的时候发现,就更好了。
第二种:
设计一个为了阻止拷贝的基类:
这样,任何人,甚至是member函数跟friend函数尝试拷贝HomeForSal对象的时候。编译器就试着生成HomeForSale的拷贝构造函数跟赋值操作符。但是这个时候要先调用基类的拷贝构造函数和赋值操作符。这时候,编译器就会拒绝这样调用。因为基类的拷贝构造函数式private。
请记住:
为了驳回编译器自动(暗自)提供的技能,可将相应的成员函数声明为private并且不予实现。像Uncopyable这样的base class也是一种做法。
第一种:把复制构造函数和赋值操作符在private中声明(不要定义,定以后,member函数和friend函数还是能访问到的)。
class HomeForSale { public: ... private: ... HomeForSale(const HomeForSale&); HomeForSale& operator=(const HomeForSale&); //只有声明! };这样,当企图拷贝或者对对象赋值的时候,编译器会报错。因为没法调用private函数。当member和friend函数调用他们的时候,链接器会报错。所以这种方法住了了对象的拷贝。
如果我们能把连接错误提前到编译的时候发现,就更好了。
第二种:
设计一个为了阻止拷贝的基类:
class Uncopyable { public: Uncopyable() { } ~Uncopyable() { } private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; class HomeForSale : private Uncopyable { ... //这个时候该class就不要再声明copy构造函数或copy assignment操作符了! }注意是私有继承。
这样,任何人,甚至是member函数跟friend函数尝试拷贝HomeForSal对象的时候。编译器就试着生成HomeForSale的拷贝构造函数跟赋值操作符。但是这个时候要先调用基类的拷贝构造函数和赋值操作符。这时候,编译器就会拒绝这样调用。因为基类的拷贝构造函数式private。
请记住:
为了驳回编译器自动(暗自)提供的技能,可将相应的成员函数声明为private并且不予实现。像Uncopyable这样的base class也是一种做法。
相关文章推荐
- 条款06 若不想使用编译器自动生成的函数 就该明确拒绝
- 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝
- 《Effective C++》学习笔记条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- 条款6:若不想使用编译器自动生成函数,就该明确拒绝
- Effective C++——》条款6:若不想使用编译器自动生成函数,就该明确拒绝 .
- [Effective C++]条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ 条款六 若不想使用编译器自动生成的函数,就该明确拒绝
- effective C++ 条款 6:若不想使用编译器自动生成的函数,就该明确将拒绝
- 条款6:若不想使用编译器自动生成的的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
- [Effective C++读书笔记]006_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ 条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++:条款06:若不想使用编译器自动生成的函数,就该明确拒绝。
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝.
- Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝(Explicitly disallow the use of compiler-generated you do not want.)
- 条款六 若不想使用编译器自动生成的函数,就该明确的拒绝
- 《Effect C++》学习------条款06:若不想使用编译器自动生成的函数,就该明确拒绝