名称隐藏在构造函数初始化列表中

Name hiding in constructor initialization list

本文关键字:初始化 列表 构造函数 隐藏      更新时间:2023-10-16

我想修改构造函数以使用初始化列表,如下例所示:

class Foo
{
public:
   Foo(std::wstring bar);
private:
   std::wstring bar;
};
// VERSION 1:
Foo::Foo(std::wstring bar) {this->bar = bar}
// VERSION 2:
Foo::Foo(std::wstring bar) : this->bar(bar) {} // ERROR!

不幸的是,我不能执行版本2,因为您不能对数据成员使用this指针,因为(我猜)它们在那时还不存在。那么,我该如何处理名称隐藏问题(即,我的参数和数据成员的名称相同)?

您不需要。第一个bar将引用成员,第二个bar将引用参数:

Foo::Foo(std::wstring bar) : bar(bar) {}

我会更改参数的名称,这样就可以清楚地知道哪个是哪个。

Foo::Foo(std::wstring b) : bar(b) {}

请注意,您不必严格要求,但您代码的未来维护者可能会感谢您。

备用选项:

在C++中,用特殊的命名约定(例如尾部下划线)表示私有成员变量是很常见的。这很好地解决了这个问题:

class Foo
{
public:
   Foo(std::wstring bar);
private:
   std::wstring bar_;
};
Foo::Foo(std::wstring bar) : bar_(bar) {}

您实际上可以做到这一点:

Foo::Foo(std::wstring bar) : bar(bar) {}

:之后使用的所有初始值设定项都必须引用基类或某个成员。这意味着您的bar成员此时不会被隐藏。

编译器会知道该怎么做……只需删除这个->