芝士wa
2024.3.30
Item6链接
对于一个自定义空类,编译器会自动提供四个构造函数:
- 默认构造函数
- 默认析构函数
- 拷贝构造函数
- 拷贝赋值运算符(=)
如果我不想有这些构造函数,应该怎么办呢?
书里给出了答案,自己声明这些函数,并设置为private,然后不去实现它,当有人不小心地调用了它们,在 link-time(连接时)会出现错误。
例子:
class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&); // declarations only
HomeForSale& operator=(const HomeForSale&);
};
此外,将连接时错误提前到编译时间也是可行的,通过写一个防止拷贝的基类,
class Uncopyable {
protected: // allow construction
Uncopyable() {} // and destruction of
~Uncopyable() {} // derived objects...
private:
Uncopyable(const Uncopyable&); // ...but prevent copying
Uncopyable& operator=(const Uncopyable&);
};
为了阻止拷贝 HomeForSale objects(对象),我们现在必须让它从 Uncopyable 继承:
class HomeForSale: private Uncopyable { // class no longer
... // declares copy ctor or
}; // copy assign. operator
“如果有人——甚至是 member(成员)或 friend function(友元函数)——试图拷贝一个 HomeForSale objects(对象),编译器将试图生成一个 copy constructor(拷贝构造函数)和一个 copy assignment operator(拷贝赋值运算符)。就象 Item 12 解释的,这些函数的 compiler-generated versions(编译器生成版)会试图调用 base class(基类)的相应函数,而这些调用将被拒绝,因为在 base class(基类)中,拷贝操作是 private(私有)的”
总结
为了拒绝编译器自动提供的机能,将相应的 member functions(成员函数)声明为 private,而且不要给出 implementations(实现)。使用一个类似 Uncopyable 的 base class(基类)是方法之一。
标签:HomeForSale,函数,Item6,private,Uncopyable,编译器,拷贝,class From: https://www.cnblogs.com/cheese-wa/p/18105513