C ++中相同的类成员名称和函数参数名称

时间:2010-02-02 03:38:37

标签: c++ arguments naming members

我有一个包含一些[公共]数据的简单对象。

我希望保持我的界面干净,所以我不想在公共可访问变量的名称和函数参数的名称之前/后修复任何内容。

那就是说,我最终做了这样的事情:

template<typename T> struct Foo
{
  explicit Foo(T x) : x(x) // This [i.e., x(x)] seems to be doing the "Right Thing", but is this well defined?
  {/*            ^ 
       No pre-/post- fixing.
   */
  }

  T x; // No pre-/post- fixing.
};

重申一下:我所要问的是这是否是明确定义的行为。不是我应该或不应该这样做......

感谢。

2 个答案:

答案 0 :(得分:7)

是的,那很好,而且非常标准。

局部变量总是在名称查找中排在第一位,但初始化列表中的x(...)显然只能引用成员变量[edit:或基类]。

如果您没有使用初始化列表,则必须写:

explicit Foo(T x)
{
    this->x = x;
}

答案 1 :(得分:1)

特别是对于ctor的初始化列表,它是明确定义的行为 - 因为你只能初始化一个成员或基类,其中一个和参数的名称之间没有歧义。

然而,在几乎任何其他情况下,你都会产生歧义。特别是,你的标题只是指“功能” - 对于除了ctor之外的任何功能,这都行不通。即使在ctor体内,它也行不通 - “特殊”处理纯粹属于ctor的初始化列表。