C++中调用类拷贝构造函数的哪种方式更值得推荐?
C++拷贝构造函数两种调用方式的对比与推荐
先看带有拷贝构造函数的示例类(已修正析构函数输出的笔误):
class Foo { public: Foo() { std::cout << "Foo::Foo\n";} ~Foo() { std::cout << "Foo::~Foo\n";} // 原代码此处输出笔误,已修正 Foo(const Foo& rhs) { std::cout << "cctor\n"; } Foo& operator=(const Foo& rhs) { if (&rhs == this) return *this; std::cout << "operator =\n"; return *this; } void bar() { std::cout << "Foo::bar\n";} };
我们可以通过以下两种方式调用拷贝构造函数创建新对象:
Foo x; Foo y; Foo z = x; // 拷贝初始化,调用拷贝构造函数 Foo a(z); // 直接初始化,同样调用拷贝构造函数
两种写法的本质与推荐性
首先明确:这两种写法在C++标准的语义上完全等价,都会调用Foo的拷贝构造函数初始化新对象,编译器不会对二者做差异化限制或优化。
从可读性和编码规范角度,更推荐Foo a(z);这种直接初始化的写法,原因如下:
- 直接初始化的写法更直观,清晰表达“构造新对象”的意图,不会和赋值操作混淆。新手很容易误以为
Foo z = x;是调用赋值运算符operator=,但实际上z是刚创建的对象,不存在“赋值”的前提(赋值是对已存在对象的操作)。 - 当类有多参数构造函数时,直接初始化的写法能保持风格一致,而拷贝初始化的写法无法适配多参数构造的场景。
不过如果团队有统一的编码风格偏好,遵循团队规范即可——这两种写法本身没有功能差异,更多是风格和可读性的选择。
内容的提问来源于stack exchange,提问作者Mantosh Kumar
相关产品推荐
相关产品推荐

