构造函数初始化列表中的"this"指针

The 'this' pointer in the initialization list of the constructor

本文关键字:this 指针 初始化 列表 构造函数      更新时间:2023-10-16

我想我无法理解为什么这不起作用。我一直认为我可以在构造函数中使用'this'指针,但我从来不知道我不能在初始化列表中使用'this'。

#include <iostream>
class A {
    public:
        int a;
        int b;
        A(int a = 0, int b = 0) : this->a(a), this->b(b) { }
        void print() {
        std::cout << a << ", " << b << std::endl;
    }
};
int main() {
    A a;
    a.print();
}

我很想知道与之相关的细节。

仅仅因为没有必要,初始值设定项列表已经可以消除歧义,因为它的语法很严格:

member(value)

因此,您可以将其更改为:

A(int a = 0, int b = 0) : a(a), b(b) {}

只有当程序员需要帮助编译器消除歧义时,才真正使用 this->member,例如,如果您的构造函数看起来像:

A(int a = 0, int b = 0) 
{ 
  // set local 'a' to itself
  a = a; 
}

你的A::a现在不会被初始化,哎呀!

您需要this来帮助编译器:

A(int a = 0, int b = 0) 
{ 
  this->a = a; // set A::a to local a.
}
this->a

语法上无效,因为它是成员访问表达式,但只允许使用标识符(或基类的类型说明符)。

从C++标准[class.base.init],

mem-initializer-id:
      类或分类类型
      标识符