3

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

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指针用于数据成员,因为(我猜)它们当时还不存在。那么,我该如何处理名称隐藏问题(即我的参数和我的数据成员具有相同的名称)?

4

4 回答 4

4

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

Foo::Foo(std::wstring bar) : bar(bar) {}
于 2013-02-05T20:32:26.003 回答
2

我会更改参数的名称,以便清楚哪个是哪个。

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) {}
于 2013-02-05T20:32:32.947 回答
2

您实际上可以这样做:

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

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

于 2013-02-05T20:32:34.867 回答
1

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

于 2013-02-05T20:34:37.067 回答