1

我正在尝试遵循 Google C++ 样式指南,特别是参考参数部分。它说总是将引用作为 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;
}

谢谢!

4

2 回答 2

1

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

但这种推理是有缺陷的。该set_filter_bank函数需要能够授予对filter_指针的写访问权限。问题是,一个函数不能授予它自己没有的访问权限。因此,即使函数不修改对象,它也需要拥有修改对象的权限才能将该权限授予其他人。因此,无论您将其设为引用还是指针,它都不能是 const。

所以,如果你坚持遵循谷歌风格指南,那么这里的适当参数就是一个指针。

于 2013-10-17T03:33:07.173 回答
0

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

决定:

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

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

事实上,在 Google 代码中,输入参数是值或 const 引用,而输出参数是指针,这是一个非常严格的约定。输入参数可以是 const 指针,但我们绝不允许非 const 引用参数,除非约定需要,例如 swap()。

但是,在某些情况下,对于输入参数,使用 const T* 比使用 const T& 更可取。例如: •您想传入一个空指针。• 该函数保存输入的指针或引用。请记住,大多数时候输入参数将被指定为 const T&。相反,使用 const T* 会向读者传达输入以某种方式受到不同处理的信息。因此,如果您选择 const T* 而不是 const T&,请出于具体原因这样做;否则,它可能会使读者感到困惑,因为他们会寻找不存在的解释。

在我看来,他们好像在说如果您将输入值传递给函数使用 const 引用,但是当您定义输出值时使用指针。这是为了让消费者清楚您的功能所期望的。const 强制执行您不会更改指针的承诺。

于 2013-10-17T03:34:52.343 回答