访问成员字段,其名称与本地变量(或参数)相同

时间:2014-04-03 08:30:13

标签: c++ this name-hiding

请考虑以下代码段:

struct S
{
   S( const int a ) 
   { 
      this->a = a; // option 1
      S::a = a; // option 2
   }
   int a;
};

选项1是否等同于选项2?是否存在一种形式比另一种形式更好的情况?标准的哪个条款描述了这些选项?

3 个答案:

答案 0 :(得分:5)

选项1相当于选项2,但选项1不适用于静态数据成员

EDITED:可以使用此指针访问静态数据成员。但是这个>成员在静态函数中不起作用。但是选项2将在静态函数中使用静态成员

例如:

struct S
{
   static void initialize(int a)
   {
      //this->a=a; compilation error
      S::a=a; 
   }
   static int a;
};
int S::a=0;

答案 1 :(得分:2)

你试过这个选项吗?

struct S
{
   S(int a) : a(a) { }
   int a;
};

看看以下内容:

  

12.6.2初始化基础和成员

     

[12] mem-initializer 表达式列表 braced-init-list 中的名称在范围内进行评估指定了 mem-initializer 的构造函数。 [示例

class X {
   int a;
   int b;
   int i;
   int j;
public:
   const int& r;
   X(int i): r(a), b(i), i(i), j(this->i) { }
};
  

初始化X::r以引用X::a,使用构造函数参数X::b的值初始化i,使用构造函数参数的值初始化X::i i,并使用X::j的值初始化X::i;每次创建类X的对象时都会发生这种情况。 - 结束示例] [注意:因为 mem-initializer 是在构造函数的范围内计算的,所以this指针可以在 mem-initializer 表达式列表中使用,以引用正在初始化的对象。 - 结束记录]

答案 2 :(得分:1)

除非a是虚函数,否则两种形式都是相同的。 ID 更喜欢this->a,因为它做了我通常想要的东西,即使它 a是一个虚函数。 (但避免这种情况不是更好 名称冲突开始。)