我正在尝试遵循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;
}
谢谢!
答案 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强制承诺你不会改变指针。