考虑以下代码片段:
struct S
{
S( const int a )
{
this->a = a; // option 1
S::a = a; // option 2
}
int a;
};
选项 1 是否等同于选项 2?是否存在一种形式优于另一种形式的情况?哪个标准条款描述了这些选项?
考虑以下代码片段:
struct S
{
S( const int a )
{
this->a = a; // option 1
S::a = a; // option 2
}
int a;
};
选项 1 是否等同于选项 2?是否存在一种形式优于另一种形式的情况?哪个标准条款描述了这些选项?
选项 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;
你试过这个选项吗?
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::a
,X::b
用构造函数参数的值初始化,用构造函数参数的值i
初始化,用 的值初始化;每次创建类对象时都会发生这种情况。— end example ] [ Note : 因为mem-initializer是在构造函数的范围内计算的,所以可以在mem-initializer的表达式列表中使用指针来引用正在初始化的对象。——尾注]X::i
i
X::j
X::i
X
this
a
除非是虚函数,否则这两种形式都是相同的。我更喜欢this->a
,因为它做我通常想要的,即使
a
是一个虚函数。(但一开始就避免名称冲突不是更好吗。)