我正在尝试遵循Google C++风格指南,特别是关于引用参数的部分。它说始终将引用作为常量引用传递。这似乎是一个好主意,因为我不希望这个函数弄乱我的FilterBank
。但是,仪器中有些地方我需要更改*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;
}
谢谢!
如果我理解正确,您正在尝试允许Instrument
类通过成员指针(filter_
)修改FilterBank
对象。 您可以通过成员函数 set_filter_bank
设置此成员指针。 您不希望此成员函数修改对象,因此希望将其设置为const
引用。
但这种推理是有缺陷的。 set_filter_bank
函数需要能够授予对filter_
指针的写入访问权限。 问题是,函数无法授予它本身没有的访问权限。 因此,即使函数不修改对象,它也需要有权修改对象才能将该权限授予其他人。 因此,无论您将其作为引用还是指针,它都不能是常量。
因此,如果您坚持遵循Google风格指南,那么此处的相应参数是一个指针。
,在您给出的链接的"决定"部分中对此进行了解释:
决定:
在函数参数列表中,所有引用都必须是 const:
void Foo(const string &in, string *out);
事实上,这是谷歌代码中一个非常强大的约定,输入 参数是值或常量引用,而输出参数是 指针。输入参数可能是常量指针,但我们从不允许 非常量参考参数,除非约定要求, 例如,swap()。
但是,在某些情况下,最好使用 const T* 到 const T& 用于输入参数。例如:•您要传入 空指针。•该函数保存指向输入的指针或引用。 请记住,大多数时候输入参数将是 指定为 const T&。而是使用 const T* 与 读者认为输入以某种方式被区别对待。所以如果你选择 const T* 而不是 const T&,这样做是有具体原因的;否则 它可能会通过让读者寻找解释来混淆他们 那不存在。
在我看来,他们说如果你将输入值传递给函数,请使用 const 引用,但是当你定义输出值时,请使用指针。 这是为了让使用者清楚地知道你的函数期望什么。 常量强制执行您不会更改指针的承诺。