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

时间:2013-02-05 20:30:32

标签: c++ constructor initialization this name-hiding

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

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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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) {}

答案 2 :(得分:2)

你实际上可以这样做:

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

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

答案 3 :(得分:1)

编译器将知道该怎么做...只需删除this->

相关问题