请考虑以下代码段:
struct S
{
S( const int a )
{
this->a = a; // option 1
S::a = a; // option 2
}
int a;
};
选项1是否等同于选项2?是否存在一种形式比另一种形式更好的情况?标准的哪个条款描述了这些选项?
答案 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
是一个虚函数。 (但避免这种情况不是更好
名称冲突开始。)