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

C++中Radio r = Radio("PSR", 100.8)与Radio r("PSR", 100.8)的区别是什么?

嘿,作为C新手能留意到这两种写法的差异,已经迈出了理解C对象初始化机制的重要一步!这两行代码本质上对应了C++里两种不同的初始化方式,我给你拆解清楚:

两种初始化方式的定义

  • 直接初始化:Radio r("PSR", 100.8);
    这种写法会直接调用与参数匹配的Radio构造函数,一步到位在r的内存位置上构造对象,没有中间临时对象的产生。

  • 拷贝初始化:Radio r = Radio("PSR", 100.8);
    从语法语义上看,这行代码会先创建一个临时的Radio对象(通过Radio("PSR", 100.8)),然后尝试把这个临时对象拷贝/移动到r中。不过放心,现代C编译器(C11及以后)会触发返回值优化(RVO),自动把这两步合并成直接构造r,所以实际运行时不会有额外的拷贝开销,和直接初始化的性能完全一致。

关键差异:explicit构造函数的影响

这两种写法的核心区别在遇到explicit修饰的构造函数时会凸显出来。假设你的Radio类构造函数是这样声明的:

class Radio {
public:
    explicit Radio(const std::string& name, double frequency) {
        // 构造逻辑
    }
};

这时:

  • Radio r("PSR", 100.8); 依然可以正常编译,因为直接初始化不受explicit限制。
  • Radio r = Radio("PSR", 100.8); 会编译报错!因为explicit构造函数禁止用于隐式的拷贝/移动初始化场景,而拷贝初始化的语法恰好属于这种隐式转换范畴。

总结

在没有explicit构造函数的情况下,编译器优化后两种写法的运行效果和性能完全相同;但从语义和语法规则上看,它们对应不同的初始化机制,且在explicit构造函数场景下表现截然不同。

内容的提问来源于stack exchange,提问作者Sten Göring

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:39:06