若不想使用编译器自动生成的函数,就该明确拒绝
独一无二的实例不允许被复制
例如:待售卖的房子
编译器产出的函数都是public
因此你可以将copy构造函数和copy assignment操作符声明为private
这样做并不绝对安全 因为member函数和friend函数还是可以调用你的private函数
因此需要将函数声明为private而且故意不实现它们(连接期报错)
将连接期报错移至编译期是可能的
需要提供一个基类将copy构造函数和copy assignment操作符声明为private
总结:
为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现
使用像uncopyable这样的base class 也是一种做法。
/***************************
effectivre c++
改善程序与设计的55个具体做法
条款6:若不想使用编译器自动生成的函数,就该明确拒绝
---------小鱼号的代码日记--------------
****************************/
/**************************
***************************/
class Uncopyable
{
public:
Uncopyable()
{}
~Uncopyable()
{}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
/**************************
独一无二的实例不允许被复制
例如:待售卖的房子
***************************/
class HomeForSale :private Uncopyable
{
public:
HomeForSale()
{}
private:
///继承Uncopyable就不再声明copy构造函数和copy assignment操作符
//HomeForSale(const HomeForSale&);
//HomeForSale& operator=(const HomeForSale&);
};
int main()
{
HomeForSale h1;
HomeForSale h2;
///HomeForSale h3(h1);//企图拷贝h1-不该通过编译
///h1 = h2;//企图拷贝h2-不该通过编译
///编译器产出的函数都是public
///因此你可以将copy构造函数和copy assignment操作符声明为private
///这样做并不绝对安全 因为member函数和friend函数还是可以调用你的private函数
///因此需要将函数声明为private而且故意不实现它们(连接期报错)
///将连接期报错移至编译期是可能的
///需要提供一个基类将copy构造函数和copy assignment操作符声明为private
return 0;
}
/**************************
总结:
为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现
使用像uncopyable这样的base class 也是一种做法。
***************************/
内容选自:
effectivre c++
改善程序与设计的55个具体做法
网友评论