您的位置:首页 > 其它

若不想使用编译器自动生成的函数,应该明确拒绝

2017-09-16 00:09 260 查看
方法是:可以将对应的函数在类中进行声明,这样编译器就不会自动去生成。可行具体方案如下:

(1).将这个函数在该类中声明为private,并不进行定义。

(但当本类成员函数或者友元函数进行调用时,编译期不会出错,连接时才开始出错)

代码示例:

class HomeForSale
{
public:
...

private:
...
HomeForSale(const HomeForSale &); // 参数并非必要,这里不去实现,所以不写
HomeForSale& operator= (const HomeForSale &);

}

(2).将该函数专门用一个基类里面进行声明为private,并不进行定义。

然后进行继承,继承类不用再写该函数。(这可以保证当本类成员函数或者友元函数进行调用时,在编译期就可以发现错误)

代码示例:

class Uncopyable
{
protected:
Uncopyable(){} // 允许继承对象的构造和析构函数
~Uncopyable(){} // 析构函数不一定得是virtual

private:
Uncopyable(const Uncopyable&); // 阻止拷贝
Uncopyable& operator=(const Uncopyable&);

}

class HomeForSale : private Uncopyable // 不一定都是public 继承
{
// class 不再声明拷贝构造函数和赋值操作符
...
}

这行得通,因为只要任何人,甚至是成员函数或友元函数,尝试拷贝,编译器便试着生成一个copy构造函数和一个copy assigenment 操作符,这些函数的“编译器生产版”会尝试调用其 base class 的对应兄弟,那些调用会被编译器拒绝,因为其 base class 的拷贝函数是private
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐