• 常用
  • 百度
  • google
  • 站内搜索

数码

C++ 禁用类的拷贝构造和赋值操作的方法

  • 更新日期:2025-11-26
  • 查看次数:3543

使用delete关键字(C++11起)可直接禁用拷贝构造和赋值操作,如NonCopyable(const NonCopyable&) = delete;;旧版本C++可通过私有化且不实现对应函数实现;现代C++推荐delete方式,安全简洁。

c++怎么禁用一个类的拷贝构造和赋值操作_c++禁止拷贝与赋值的实现方法

在C++中,如果想禁用一个类的拷贝构造和赋值操作,防止对象被意外拷贝或赋值,可以使用以下几种方法,具体取决于使用的C++标准版本。

使用 delete 关键字(C++11 及以后)

从 C++11 开始,最直接的方式是将拷贝构造函数和拷贝赋值运算符声明为 = delete,显式删除它们:

class NonCopyable {
public:
    NonCopyable() = default;

    // 禁用拷贝构造
    NonCopyable(const NonCopyable&) = delete;

    // 禁用拷贝赋值
    NonCopyable& operator=(const NonCopyable&) = delete;
};

这样任何尝试拷贝或赋值该类对象的行为都会在编译时报错。

将拷贝函数设为私有且不实现(C++98/03 风格)

在没有 C++11 支持的旧项目中,可以通过将拷贝构造函数和赋值运算符声明为私有成员,并且不提供实现来达到禁用目的:

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

public:
    NonCopyable() {}
};

由于这些函数是私有的,外部代码无法调用。链接时若被意外调用会报错(因为无实现),但这种方式不如 = delete 安全和清晰。

继承自 boost::noncopyable 或 std::noncopyable(推荐封装)

一些库提供了现成的不可拷贝基类。例如 Boost 库中的 boost::noncopyable

#include <boost/utility.hpp>

class MyClass : private boost::noncopyable {
    // 自动禁用拷贝与赋值
};

虽然标准库没有直接提供 std::noncopyable,但你可以自己定义一个类似的基类,用于多个需要禁用拷贝的类复用。

基本上就这些方法。现代C++推荐使用 = delete,简洁、安全、语义明确。如果你维护的是老项目,再考虑私有化方式。禁用拷贝常见于管理资源的类,比如文件句柄、互斥锁、单例等,避免资源重复释放或状态混乱。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken