如何初始化已删除拷贝构造函数与赋值运算符的类成员变量?
解决方法
因为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
相关产品推荐
相关产品推荐

