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);     // 错误
    
posted @ 2023-07-12 21:42  CodeMagicianT  阅读(602)  评论(0)    收藏  举报