【Effective C++】条款6:若不想使用编译器自动生成的函数,就该明确拒绝
2023-12-14 19:07:13
有这样一个类,我不想要创建出来的对象被拷贝,应该如何做?我们自己不写拷贝构造和拷贝赋值函数,编译器就会为我们自动生成,所以我们应该明确拒绝编译器!
1.将拷贝构造和拷贝赋值声明为private
class HomeForSale
{
public:
//……
private:
HomeForSale(const HomeForSale&);//只有声明,不提供定义
HomeForSale& operator=(const HomeForSale&);//只有声明,不提供定义
};
我们自己声明了,编辑器就不会再多管闲事。由于是private,在类外就不能调用,如果调用会发生编译错误。如果是在友元函数或友元类中调用呢?编译倒是能通过,但是由于只有声明,没有定义,链接阶段就会出问题。
2.继承一个类,将父类的拷贝构造和拷贝赋值声明为private
我们希望错误最好在编译时就被发现,于是可以这样做:
class UnableCopy
{
private:
UnableCopy(const UnableCopy&);
UnableCopy& operator=(const UnableCopy&);
};
class HomeForSale : private UnableCopy //这里的继承方式也可以写成public,写成private表示继承父类不是用来实现多态的
{
public:
//……
private:
//……
};
调用子类的拷贝构造,会先调用父类的拷贝构造,但由于父类拷贝构造是私有的,所以访问不了,拷贝赋值也是同理。这样一来,不管是不是HomeForSale的友元,都无法调用拷贝构造和拷贝赋值了,编译阶段就会报错。
3.使用关键字delete
C++11推出了一个新的关键字,使用它能删除函数。
class HomeForSale
{
public:
HomeForSale(const HomeForSale&) = delete;
HomeForSale& operator=(const HomeForSale&) = delete;
private:
//……
};
文章来源:https://blog.csdn.net/weixin_74113106/article/details/134864488
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!