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; }
总结一下选择优先级
- 优先用const引用:当你只需要读取对象、不需要修改,且对象一定非空时,这是兼顾性能、安全和代码简洁性的最佳选择。
- 用指针:仅当你需要允许空值,或者需要在函数内重新指向其他对象时使用,记得加const保证只读。
- 传值:只适合小型、可快速拷贝的类型,或者函数需要拥有对象的独立副本时使用。
内容的提问来源于stack exchange,提问作者Martin Prince
相关产品推荐
相关产品推荐

