Effective C++ .06 阻止编译器自动生成函数以及被他人调用
2014-12-21 15:52
281 查看
这节讲了下如何防止对象拷贝(隐藏并不能被其他人调用)
两种方法:
1. 将拷贝构造函数声明为private 并且声明函数但不进行定义
不进行定义是防止被内部的函数调用,这样就会在链接的时候报错。
2. 继承一个拷贝构造函数和copy assignment函数为private的类,如05所述,默认的拷贝函数会调用父类和成员的对应拷贝函数,如果这个函数不能执行那么函数就无法被生成了
[Note] 'Fake::Fake(const Fake&)' is implicitly deleted because the default definition would be ill-formed:
[Error] 'Uncopyable::Uncopyable(const Uncopyable&)' is private
这里也只能阻止默认拷贝
两种方法:
1. 将拷贝构造函数声明为private 并且声明函数但不进行定义
#include <iostream> #include <cstdlib> class Dummy { public: Dummy(int d = 0) : data(d) {} Dummy* getCopy() { Dummy* x = new Dummy(*this); return x; } private: int data; Dummy(const Dummy& org); }; int main() { Dummy d(1); // will case link error d.getCopy(); // will case compile error Dummy d2(d); return 0; }
不进行定义是防止被内部的函数调用,这样就会在链接的时候报错。
2. 继承一个拷贝构造函数和copy assignment函数为private的类,如05所述,默认的拷贝函数会调用父类和成员的对应拷贝函数,如果这个函数不能执行那么函数就无法被生成了
class Uncopyable { public: Uncopyable(){}; private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; class Fake: public Uncopyable { private: int data; public: Fake(int d): data(d){}; }; Fake f(1); Fake f2(f);
[Note] 'Fake::Fake(const Fake&)' is implicitly deleted because the default definition would be ill-formed:
[Error] 'Uncopyable::Uncopyable(const Uncopyable&)' is private
这里也只能阻止默认拷贝
相关文章推荐
- Item 5 编译器自动生成和调用的函数
- 条款6:若不想使用编译器自动生成的函数,就该明确拒绝
- 隐式成员函数:由编译器自动生成的函数(自动是罪恶的根
- 条款6:若不想使用编译器自动生成函数,就该明确拒绝
- 读书笔记_Effective_C++_条款六:若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就应该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝.
- effective C++ 条款 6:若不想使用编译器自动生成的函数,就该明确将拒绝
- 编译器不会自动生成调用基类复制构造函数的代码
- 若不想使用编译器自动生成的函数,就该明确拒绝
- 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
- 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝
- 条款6:若不想使用编译器自动生成的的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝(Explicitly disallow the use of compiler-generated you do not want.)
- 编译器为C++ 空类自动生成的成员函数
- 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
- Effective C++ 06 若不想使用编译器自动生成函数,就该明确拒绝 笔记
- 若不想使用编译器自动生成的函数,就应该明确拒绝
- 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
- [Effective C++读书笔记]006_条款06_若不想使用编译器自动生成的函数,就该明确拒绝