116.如何禁止程序自动生成拷贝构造函数?
116.如何禁止程序自动生成拷贝构造函数?
在 C++ 里,想禁止编译器自动生成拷贝构造、拷贝赋值,有三种常用写法,我按现代 C++ 推荐程度给你排好序:
1. C++11 最推荐:= delete(首选)
直接告诉编译器:禁止生成,也禁止调用
class Test
{
public:
Test() = default; // 默认构造
Test(const Test&) = delete; // 禁用拷贝构造
Test& operator=(const Test&) = delete; // 禁用拷贝赋值
};
- 最清晰、最标准
- 编译期直接报错,无法调用
- 面试 / 工程里标准答案
2. 老式方法:声明为 private 且不实现
class Test
{
private:
Test(const Test&); // 只声明不实现
Test& operator=(const Test&);
public:
Test() {}
};
- C++98 时代常用
- 外部不能访问,链接时报错
3. 继承 boost::noncopyable 或自己写基类
class NonCopyable
{
protected:
NonCopyable() = default;
~NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
};
class Test : public NonCopyable
{
// 自动不能拷贝
};
很多项目都用这种基类统一禁止拷贝。
关键结论
-
想禁止拷贝构造函数,必须同时禁掉拷贝赋值运算符,否则不彻底
-
现代 C++ 一律用
= delete -
一旦禁用,下面代码都会编译报错:
Test t1; Test t2 = t1; // 错误 Test t3(t1); // 错误

浙公网安备 33010602011771号