NonCopyable

2024-01-09 15:05:22

NonCopyable 是 C++ 用于阻止派生类生成拷贝构造和拷贝赋值函数的一个通用类,在很多地方都有使用,例如 arm、boost等,在 effective c++ 中也有讲到,以下是一种使用方法:

class NonCopyable {
private:
	NonCopyable(const NonCopyable &);
	NonCopyable& operator=(const NonCopyable &);
protected:
	NonCopyable() {}
	~NonCopyable() {}
};

class Derive : public NonCopyable {};

将拷贝构造和拷贝赋值设为私有成员,子类无法访问,通过该方式实现上述功能,当然更合理的写法是采用 delete 操作符

class NonCopyable {
public:
	NonCopyable(const NonCopyable &) = delete;
	NonCopyable& operator=(const NonCopyable &) = delete;
protected:
	NonCopyable() = default;
	~NonCopyable() = default;
};

class Derive : public NonCopyable {};

这样显示的告诉编译器,禁止生成拷贝构造和拷贝赋值函数。可以做实现验证这一点:

class NonCopyable {
public:
	NonCopyable(const NonCopyable &) = delete;
	NonCopyable& operator=(const NonCopyable &) = delete;
protected:
	NonCopyable() = default;
	~NonCopyable() = default;
};

class Derive : public NonCopyable {
public:
	Derive(int _a) : a(_a) {}
	Derive() {}

	Derive(const Derive& tmp) : NonCopyable(tmp) {
		std::cout << "copy constructor has call\n";
		this->a = tmp.a;
	}
	
	Derive& operator=(const Derive& tmp) : NonCopyable(tmp) {
		NonCopyable::operator=(tmp);
		std::cout << "copy assignment has call\n";
		this->a = tmp.a;
		return *this;
	}
private:
	int a;
}

这是一个正确的测试案例,注意 Derive 类的拷贝构造和拷贝赋值写法,如果省略掉基类信息(NonCopyable),那么在调用 Derive 的拷贝构造和拷贝赋值时,NonCopyable 实际上调用的是构造函数,从而丧失了目标功能。

文章来源:https://blog.csdn.net/qq_35227495/article/details/135478240
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。