【问题标题】:Is is better to do const pass by references over non-const pass by references?通过引用传递 const 比通过引用传递非 const 更好吗?
【发布时间】:2009-11-23 01:28:26
【问题描述】:

我遇到了这个。

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Reference_Arguments#Reference_Arguments

根据样式指南,只允许 const 引用作为参数。 (我是这么理解的)

不过,我似乎不喜欢这种方法。

评论?

【问题讨论】:

标签: c++ pass-by-reference


【解决方案1】:

以下是一些经验法则,在您做出选择时可能会很有用:

如果您不需要修改传递给函数的对象,请考虑对象的大小是否小于或等于指针的大小。如果是,则按值传递;否则,通过 const 引用传递。

如果您确实需要修改传递给函数的对象,请考虑参数是否可选(即 null 是有效参数)。如果是,则通过指针传递;否则,通过非常量引用传递。

【讨论】:

    【解决方案2】:

    Google 建议只使用 const 引用,因为他们认为在函数可能修改对象时传递指针更清晰。这可能是真的,但我更喜欢只在 null 是可接受的值时使用指针。

    为了澄清,这里有一个解释他们论点根源的例子。

    Car c;
    foo(c);
    

    函数是否修改 c 完全取决于它是如何声明的,仅查看调用本身并不能说明可能发生的情况。

    void foo(Car c);  
    void foo(const Car &c);  OR 
    void foo(Car &c); 
    

    现在考虑

    Car c;
    foo(&c);
    

    传递了对象的地址后,就更容易(从调用者的角度)查看函数是否会更改您的对象。当然,它不能保证它可以是指向 const 对象的指针,但从代码审查者的角度来看,更容易检测到该对象可能会在函数被传递一个指针时被更改。当严格执行 Google 的建议时,通过指针传递的对象将始终是可变的,而任何不通过指针传递的对象都将是 const。 (通过 const & 或 b/c 值传递)

    这是否更好是值得商榷的。我会决定你的感受并在你的团队中保持一致。

    【讨论】:

    • 很好的解释,但在复杂的 IDE 时代,为了可读性而传递指针似乎是一种可疑的做法。
    • 这是 Google 的做法。他们对很多事情都有很强的想法……比如使用不完整的构造函数和init方法……我有时想知道他们是用C还是C++编程
    • "更容易检测到这个对象可能被改变了" 每次我们看到指针传递的东西,脑子里都会有一句话说“它可以改变!”?路过&, const &, *, const *, 在这方面都是一样的。从调用者的角度来看,传递指针不会改变任何东西,除非按照惯例。
    【解决方案3】:

    它也让你可以做到

    void x(const std::string& x)

    x("你好");

    没有 const 它将无法工作。

    【讨论】:

    • 为什么不呢?我不明白你在说什么,你能扩展一下吗?
    • @Newton Falls:我认为他的意思是说“作为右值的临时变量不能绑定到非常量引用”
    • 它不起作用的原因是,如果函数中的引用不是 const (即它是可变的),如果修改它会发生什么变化?在这个例子中,传入了一个右值。一个临时对象,一旦函数调用结束就会被丢弃。修改引用意味着函数体之外的持久性,这对于右值是不可能的。因此,将右值绑定到非常量引用是编译器错误。
    【解决方案4】:

    这是一种偏好,我可以说这是一种偏好:

    void align_left();
    // vs.
    void alignLeft();
    

    既然你想通过非 const 引用传递参数,那么就这样做吧。我不喜欢传递指针。该约定通常具有其他含义(即许多程序员看到一个指针并认为可能不需要该参数,然后不得不去检查文档)。因此,按照惯例,您通常会使参数名称表明它会改变参数。

    t_result getDate(t_string& outString) const;
    

    然后名称表示突变。如果您在代码库中很少通过 ref,这可能有点欺骗性,但它最终是“好的”并且具有足够的积极意义。关于风格,很多都回到了一致性。随着程序的真正扩展,(IMO)这真的很有帮助 - 只需确保程序的意图清晰且样式一致(至少您在编写庞大的代码库之前需要阅读样式文档)。

    【讨论】:

    • “这是一种偏好” 很好的答案。感谢您不假装传递指针是可变性的线索(约定/样式除外)。您强调风格的一致性是正确的关键。关于“[参数] 名称然后表示突变”,当然,如果您已经在查看声明,const 很容易看到(或看不到)。
    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多