使用const-reference进行赋值

时间:2013-10-17 03:09:14

标签: c++ styles const parameter-passing

我正在尝试遵循Google C ++样式指南,特别是the section on reference arguments。它表示始终将引用作为const引用传递。这似乎是一个好主意,因为我不希望这个功能弄乱我的FilterBank。但是,在Instrument中我需要更改*filter_,因此使filter_ const不是一个好的解决方案。这是否意味着我应该传入指针FilterBank *f?这样做只是一个风格问题吗?如果需要,可以在此函数中更改f的任何内容,这正是我想要避免的。

//This code assigns the instrument's filter to some pre-made filter, f
void Instrument::set_filter_bank(FilterBank &f) {
  filter_ = &f;
}

谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您试图允许Instrument类有权通过成员指针(FilterBank)修改filter_对象。您可以通过成员函数set_filter_bank设置此成员指针。您不希望此成员函数修改对象,因此您希望将其作为const引用。

但这种推理存在缺陷。 set_filter_bank函数需要能够授予对filter_指针的写访问权。问题是,函数不能授予它本身没有的访问权限。因此,即使函数不修改对象,它也需要使用 right 来修改对象,以便将该权限授予其他人。因此,无论您将其作为引用还是指针,它都不能是const。

因此,如果您坚持按照Google风格指南操作,那么此处的相应参数就是指针。

答案 1 :(得分:0)

在我看来,您所提供的链接的“决定”部分对此进行了解释:

决定:

  

在函数参数列表中,所有引用必须是const:

void Foo(const string &in, string *out);
     

事实上,在Google代码中输入是一个非常强大的惯例   参数是值或const引用,而输出参数是   指针。输入参数可能是常量指针,但我们绝不允许   非常规参考参数,除非按惯例要求,   例如,swap()。

     

但是,在某些情况下,最好使用const T *   对const T&用于输入参数。例如:•您想要传入   空指针。 •该函数保存指针或输入的引用。   请记住,大多数时候输入参数都是   指定为const T&。使用const T *代替传递给   读者,输入以某种方式区别对待。所以,如果你选择   const T *而不是const T&,出于具体原因这样做;除此以外   通过让读者寻找解释,它可能会使读者感到困惑   那不存在。

在我看来他们说如果你将一个输入值传递给函数使用一个const引用,但是当你定义一个输出值时,使用一个指针。这是为了让消费者清楚您的功能是什么。 const强制承诺你不会改变指针。