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

C++中类作为参数传递:按值还是按指针更优?

关于C++函数参数传递:传值、指针还是引用?

作为C++新手能考虑到拷贝开销,这已经是写出高质量代码的好起点了!咱们来拆解你的问题,把几种传递方式的优劣和适用场景说清楚:

先看你当前的写法:传值 UI::GetColor(CClass Class)

这种写法会在调用函数时拷贝整个CClass对象,带来两个潜在问题:

  • 如果CClass是一个包含大量成员(比如数组、动态内存、其他复杂对象)的类,拷贝操作会产生明显的性能开销,尤其是在频繁调用这个函数的时候。
  • 如果CClass的拷贝构造函数没有正确实现(比如浅拷贝了动态分配的内存),还可能导致内存泄漏、野指针等隐蔽bug。

当然也有例外:如果CClass是像int、char这种极小的类型,或者是设计成轻量、可快速拷贝的类(比如std::array固定大小数组),传值的开销可以忽略不计,但自定义类CClass大概率不属于这种情况。

选项1:传指针 UI::GetColor(const CClass* Class)

用指针传递确实能避免拷贝,但它有几个需要注意的点:

  • 调用时必须传对象的地址(比如UI::GetColor(&myClass)),写法上比传值繁琐一点。
  • 指针可能为nullptr,你必须在函数里加判断(比如if (!Class) { /* 处理空指针逻辑 */ }),否则直接访问Class->m_Something会触发未定义行为(程序崩溃)。
  • 如果函数不需要修改传入的对象,一定要加const(const CClass*),这样编译器会帮你阻止意外修改,提升代码安全性。

指针适合的场景:当你需要允许函数接收空值,或者需要在函数内部改变指针指向的对象时。但你的函数只是读取m_Something,显然不需要这些特性。

选项2:传const引用 UI::GetColor(const CClass& Class)

这才是最适合你当前场景的最优写法,原因如下:

  • 和指针一样,完全避免了对象拷贝,性能高效。
  • 引用必须绑定到一个有效的对象,不存在空引用的问题,不用额外处理空值情况,代码更简洁安全。
  • 调用方式和传值几乎一样(直接传对象:UI::GetColor(myClass)),不用写取地址符。
  • const修饰保证了函数内部不会修改传入的对象,完美匹配你函数“只读判断”的语义。

修改后的代码应该是这样:

int UI::GetColor(const CClass& Class) {
    if (Class.m_Something) {
        return 0;
    }
    return 1;
}

总结一下选择优先级

  1. 优先用const引用:当你只需要读取对象、不需要修改,且对象一定非空时,这是兼顾性能、安全和代码简洁性的最佳选择。
  2. 用指针:仅当你需要允许空值,或者需要在函数内重新指向其他对象时使用,记得加const保证只读。
  3. 传值:只适合小型、可快速拷贝的类型,或者函数需要拥有对象的独立副本时使用。

内容的提问来源于stack exchange,提问作者Martin Prince

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:51:45