混合const和非const传递引用的参数顺序

时间:2010-02-23 21:43:32

标签: c++ const

为了与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 个答案:

答案 0 :(得分:4)

STL算法最后放置输出(非常量)值。在那里你有一个C ++的先例,每个人都应该知道。

我也倾向于从重要的角度订购论据,而不是重要的。 (即盒子的大小在盒子边缘调整值之前。)

(请注意:无论你做什么,都要保持一致!这比选择这种或那种方式更重要......)

答案 1 :(得分:1)

可能有帮助的几点:

  • 是的,我喜欢尽可能遵循标准库的参数排序约定的想法。最少惊喜的原则。所以,好的去。但是,请记住,C标准库本身并没有很好地制作,特别是如果你看一下文件处理API。所以要小心 - 从这些错误中吸取教训。

  • 很少使用基本算术类型的
  • const,如果你这样做会更令人惊讶。

  • STL,即使有其缺陷,IMO也是一个更好的例子。

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

  • 传递const-reference而不是value - 节省大量复制开销(时间和内存损失)

所以,你的函数签名应该更像是这样:

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

(如果可能,我可能会想std::vector<double>隐藏typedef。)

  

一般情况下,选择(非const,const)(const,non-const)或仅在某些情况下更好吗?是否有任何理由选择一个,或者我应该选择一个并坚持下去?

尽可能使用宽容剂const。对于参数,对于函数。您正在向编译器做出承诺(与您的设计保持一致),编译器将在您每次使用诊断程序时帮助您。充分利用您的语言功能和编译器。此外,了解const&(const-refernces)及其潜在的性能优势。