1
//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;
}

From the code above the lines I am focusing on are the this->health = Health lines. I'm wondering why I need to use this->health instead of health = Health. I know it has something to do with the fact that I'm creating new Player objects with an array (I'm doing a tutorial on it). I just don't understand why it makes it so I have to use this-> or how it works. Thanks.

4

6 回答 6

6

你不要用这个。health = Health;将工作。但正确的方法是使用初始化:

Player(int Health) : health(Health) {
  // constrcutor code
}
于 2013-07-01T09:33:20.790 回答
3
    Player(int Health){
    cout << "2nd overload" << endl;
    this->health = Health;
}

如果您的 Health 名称为 health 且标题低于您需要使用 this 指针,否则 c++ 不知道您要使用类变量并将使用参数变量。

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

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

于 2013-07-01T09:30:05.637 回答
2

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

于 2013-07-01T09:26:44.937 回答
1

这是 C++,不是 python。名称查找使得 this->member 始终被认为没有前缀,只有在您引入本地或函数参数来隐藏它时才会被隐藏。(另一个特殊情况是在模板中访问基类成员。)

不幸的是,一些像 VTK 这样的库在他们的风格中制造了 this->noise 的废话,所以它像癌症一样传播。

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

于 2013-07-01T09:32:24.970 回答
1

我唯一使用“this”的时候是我想明确指出我指的是什么对象。即,我在复制构造函数和赋值运算符中使用“this”。

于 2013-07-01T09:50:26.970 回答
0

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

于 2013-07-01T12:09:11.497 回答