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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:22:15