You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何初始化已删除拷贝构造函数与赋值运算符的类成员变量?

解决方法

因为Bar禁用了拷贝构造函数和赋值运算符,且没有默认构造函数,你不能先默认构造m_bar再赋值,必须在Foo的构造阶段直接初始化成员变量,这就要用到C++的成员初始化列表语法。

另外注意两个前提:

  • Bar的构造函数需要设置为public,否则Foo无法访问它创建对象;
  • Foo的构造函数也需要设为public(如果要外部实例化Foo的话)。

修改后的完整代码

#include <string>

class Bar 
{
public:
    explicit Bar(std::string param);
    Bar(Bar const &) = delete;
    void operator=(Bar const &x) = delete;
};

class Foo 
{
private:
    Bar m_bar;
public:
    Foo();
};

// 使用成员初始化列表直接初始化m_bar
Foo::Foo() : m_bar("new value") 
{
    // 构造函数体内无需再做赋值操作
}

关键说明

  • Foo::Foo() : m_bar("new value") 中的: m_bar("new value")就是成员初始化列表,它会直接调用Bar的explicit Bar(std::string)构造函数来创建m_bar,全程不会触发拷贝或赋值操作,完全符合Bar的禁用规则。
  • 如果需要动态传递参数给Bar的构造函数,比如Foo的构造函数接收外部参数,可以这样写:
Foo::Foo(std::string param) : m_bar(std::move(param)) 
{
}

这里用std::move可以避免std::string的拷贝,提升效率(只要Bar没有显式禁用移动构造,默认是允许移动操作的)。

内容的提问来源于stack exchange,提问作者Roman Goyenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:22:44