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

C++对象传递约定制定咨询:指针与引用参数传递规则探讨

嘿,我刚好在团队里推行过一套类似的参数传递约定,结合你梳理的核心规则,再补充上所有权转移的部分,分享给你参考:

C++ 参数传递约定细则

基础传递规则(你梳理的部分细化)

先快速提一句值传递:简单类型(int、bool等)或者小型结构体直接用值传递,清晰无歧义,这个你也说过就不多展开了。重点说引用和指针的场景:

  • 非const引用传递:直接告诉调用方——这个对象会被函数修改,不用猜,看签名就懂。比如:
    void syncUserToDB(User &user); // 调用方明确:传进去的user会被更新
    
  • const引用传递:表示函数只会读这个对象,绝对不会改,主要用来避免大对象拷贝的性能浪费,同时保证安全。比如:
    void generateUserReport(const User &user); // 放心传,user原样返回
    
  • 指针传递:和你想的一致,核心意图是函数需要把这个对象的引用/指针存储起来(比如存到类成员变量、全局缓存里)。调用方看到指针参数,就得警惕:这个对象的生命周期必须比函数存储它的地方更长,不然会出现悬空指针。比如:
    void registerUserCallback(User *user); // 函数会把user指针存在回调列表里
    

所有权转移的补充约定

这部分是你提到的空白,我在项目里是这么统一规则的:

  • 用智能指针值传递+显式move转移所有权:这是最清晰的方式,调用方必须写std::move,相当于主动把所有权交出去,完全没有歧义。比如:
    void takeUserOwnership(std::unique_ptr<User> user);
    // 调用方调用:takeUserOwnership(std::move(myUser));
    
  • 右值引用传递(可选):如果想更明确地表示“只接受即将销毁的对象”,也可以用右值引用,但我更推荐上面的智能指针值传递,因为代码更简洁,不容易写错。比如:
    void takeUserOwnership(std::unique_ptr<User> &&user);
    
  • 禁止用裸指针传递所有权:裸指针的语义太模糊了,到底是存储引用还是转移所有权?很容易搞混。除非是维护老项目,否则一定要用智能指针来明确所有权意图。

这套规则在团队里推行起来很顺畅,大家看函数签名就知道该怎么传参、要注意什么风险,你可以根据自己的项目需求微调细节~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:05:51