代码之家  ›  专栏  ›  技术社区  ›  Seth Johnson

混合常量和非常量按引用传递的参数顺序

  •  3
  • Seth Johnson  · 技术社区  · 15 年前

    using non-member functions where possible to improve encapsulation ,我编写了许多类,它们的声明类似于:

    void auxiliaryFunction(
            const Class& c,
            std::vector< double >& out);
    

    它的目的是用 c 您可能会注意到它的参数顺序类似于python成员函数, def auxiliaryFunction(self, out) .

    out = auxiliaryFunction(c) . 这个成语用在,例如,

    char* strcpy ( char* destination, const char* source );
    

    类似于非必需成员函数,即初始化我创建的新对象的函数:

    void initializeMyObject(
        const double a,
        const std::vector<double>& b,
        MyObject& out);
    

    auxiliaryFunction ?

    总的来说,选择比较好吗 (non-const , const) 结束 (const, non-const) ,还是仅在某些情况下?有什么理由选一个,还是我应该选一个然后坚持下去?

    Google style guide 的建议使用指针而不是非常量引用,但这与我的问题无关。)

    2 回复  |  直到 15 年前
        1
  •  4
  •   Macke    15 年前

    我也倾向于把论点从重要到不重要排序(i、 e.框的大小在框边距调整值之前。)

    (不过要注意:无论你做什么,都要始终如一!这比选择这条路或那条路要重要得多……)

        2
  •  1
  •   dirkgently    15 年前

    以下几点可能会有所帮助:

    • 是的,我喜欢尽可能遵循标准库的参数排序约定。最小意外原则。好了,走吧。但是,请记住,C标准库本身并不是很好地构建,特别是如果您查看文件处理API的话。所以要小心——从这些错误中吸取教训。

    • const

    • 尽管STL有其缺陷,IMO还是提供了一个更好的例子。

    • 最后,请注意,C++还有另一个优点,即返回值优化,默认情况下,大多数现代编译器都启用了返回值优化。我会用它重写你的 initializeMyObject 或者更好,使用类和构造函数。

    • 按常量引用传递而不是按值传递—节省大量复制开销(时间和内存代价)

    因此,函数签名应该更像这样:

     MyObject initializeMyObject(
        double a,
        const std::vector<double>& b,
        );
    

    std::vector<double> 通过 typedef 如果可能的话。)

    一般来说,是选择(non-const,const)而不是(const,non-const),还是只在某些情况下?有什么理由选一个,还是我应该选一个然后坚持下去?

    使用适量的 只要你能。对于参数,对于函数。您正在向编译器作出承诺(要忠于您的设计),编译器将在您每次偏离诊断时帮助您。充分利用您的语言功能和编译器。进一步了解 const& (const references)及其潜在的性能优势。