C++ "this"类属性

C++ "this" class attribute

本文关键字:属性 this C++      更新时间:2023-10-16
//C++ Made Easy HD 26 - Introduction to Classes
//Michael LeCompte
#include <iostream>
#include <string>
using namespace std;

class Player {
public:
    Player() {
        cout << "1st overload" << endl;
    }
    Player(int Health){
        cout << "2nd overload" << endl;
        this->health = Health;
    }
    Player(int Health, int attPow){
        cout << "3nd overload" << endl;
        this->health = Health;
        attackPower = attPow;
    }
    ~Player() {
        cout << "Player instance destroyed" << endl;
    }
    //Mutators
    void setHealth(int val) {
        health = val;
    }
    void setAttPow(int val) {
        attackPower = val;
    }
    void setDef(int val) {
        defense = val;
    }
    void setXp(int val) {
        xp = val;
    }
    //Accessors
    int healthVal() {
        return health;
    }
    int attPowVal() {
        return attackPower;
    }
    int defVal() {
        return defense;
    }
    int xpVal() {
        return xp;
    }
private:
    int health;
    int attackPower;
    int defense;
    int xp;
};

int main() {
    Player player[4] = {Player(2, 5), Player(65, 2), Player(2), Player(1)};
    cout << player[0].healthVal() << endl;
    cout << player[1].healthVal() << endl;
    cout << player[2].healthVal() << endl;
    system("pause");
    return 0;
}

从上面的代码中,我关注的行是this->health = Health行。我想知道为什么我需要使用 this->health 而不是 health = Health .我知道这与我正在使用数组创建新的Player对象这一事实有关(我正在做一个教程(。我只是不明白为什么它会这样,所以我必须使用this->或它是如何工作的。谢谢。

你不要使用它。 health = Health;会起作用。但正确的方法是使用初始化:

Player(int Health) : health(Health) {
  // constrcutor code
}
    Player(int Health){
    cout << "2nd overload" << endl;
    this->health = Health;
}

如果你的运行状况名称是标题较低的运行状况,则需要使用 this 指针,因为否则 C++ 不知道要使用类变量,并将使用参数变量。

在您的示例中,C++ 知道要使用 1 个(区别在于标题(,您可以跳过 this 指针。

但健康应该通过命名约定使用较低的标题

您不需要在示例中使用 this->。这是可选的。如果没有this->,你的代码将是完全等价的。

这是

C++,不是python。名称查找是这样的,这个>成员总是被认为是没有前缀的,只有当你引入一个本地或函数参数来隐藏它时,它才会被隐藏。(另一种特殊情况是在模板中访问基类成员。

不幸的是,像VTK这样的一些图书馆在他们的风格中制造了这种>噪音的废话,所以它像癌症一样传播。

在您的示例中,没有隐藏,因此没有理由使用前缀。作为单独的说明,在 ctors 中,好的代码将使用 init list 而不是赋值,并使 1-param 版本显式。 对于这些情况,您甚至可以使用与成员相同的参数名称。

我唯一一次使用"this"是当我想明确我指的是什么对象时。 也就是说,我在复制构造函数和赋值运算符中使用"this"。

如果您定义了名为 health 的任何局部变量,那么,为了区分此局部变量和类的数据成员,您需要严格使用指针this。在其他情况下,使用指针也是一种很好的做法this但不是必需的。