4

考虑以下代码片段:

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

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

4

3 回答 3

5

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

已编辑:可以使用此指针访问静态数据成员。但是 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;
于 2014-04-03T08:37:21.357 回答
2

你试过这个选项吗?

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

看看以下内容:

12.6.2 初始化基和成员

[12] mem-initializer 的 expression-list 或 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::aX::b用构造函数参数的值初始化,用构造函数参数的值i初始化,用 的值初始化;每次创建类对象时都会发生这种情况。— end example ] [ Note : 因为mem-initializer是在构造函数的范围内计算的,所以可以在mem-initializer的表达式列表中使用指针来引用正在初始化的对象。——尾注]X::iiX::jX::iXthis

于 2014-04-03T08:47:28.240 回答
1

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

于 2014-04-03T08:59:05.410 回答