【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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。