【问题标题】:Access member field with same name as local variable (or argument)访问与局部变量(或参数)同名的成员字段
【发布时间】:2014-04-03 08:30:13
【问题描述】:

考虑以下代码 sn-p:

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

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

【问题讨论】:

  • 我宁愿避免这个名字的巧合。
  • 同意。有什么区别?

标签: c++ this name-hiding


【解决方案1】:

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

EDITED:静态数据成员可以用这个指针访问。但是 this->member 在静态函数中不起作用。但选项 2 将在具有静态成员的静态函数中工作

例如:

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

【讨论】:

  • 它适用于所有成员,无论是字段还是成员函数。
  • 如果a 是一个虚函数,它们就不等价了。
【解决方案2】:

你试过这个选项吗?

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

请看以下内容:

12.6.2 初始化基和成员

[12] mem-initializerexpression-listbraced-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,用构造函数参数i的值初始化X::b,用构造函数参数i的值初始化X::i,用构造函数参数X::j初始化X::j X::i 的值;每次创建 X 类的对象时都会发生这种情况。 — 结束示例 ] [ 注意:因为 mem-initializer 是在构造函数的范围内计算的,所以可以使用 this 指针在 mem-initializerexpression-list 中引用正在初始化的对象。 — 尾注 ]

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你能举出a是虚函数的例子吗?
    • @alexolut struct X { virtual void f(); void g() { this->f(); } }; 在这里使用X::f() 会产生不同的语义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2017-03-04
    • 2011-06-16
    • 2013-04-12
    • 2011-03-14
    相关资源
    最近更新 更多