除非指定“this”关键字,否则无法调用getter方法

时间:2016-01-08 19:47:06

标签: c++

为什么教程页面中的示例在构造函数中没有this关键字的情况下可以正常工作?

网站上的代码:

#include <iostream>
using namespace std;

class Rectangle {

 int width, height;

   public:
   Rectangle ();
   Rectangle (int,int);    
   int getWidth() {
      return width;
   }
};

Rectangle::Rectangle () {
  width = 5;
  height = 5;
}

Rectangle::Rectangle (int a, int b) {
  width = a;
  height = b;
}

int main () {
  Rectangle rect (3,4);
  Rectangle rectb;
  cout << "rect area: " << rect.getWidth() << endl;
  cout << "rectb area: " << rectb.getWidth() << endl;
  return 0;
}

我的代码:

class Person {
  int age;
  std::string name;

public:
  Person();
  Person(int, std::string);

  std::string * getName() {
    return &name;
  }

  int * getAge() {
    return &age;
  }
};

Person::Person () {
  age = 25;
  name = "John";
}

Person::Person (int age, std::string name){

// This is the part :
  this->age = age;
  this->name = name;

}

int main() {
  Person john(45, "Doe");
  printf("Name %d \n", *john.getAge() );
  std::cout << "Age " << *john.getName() << std::endl;
  return 0;
}

正如您在我的代码中所看到的,我必须使用this->name,如果不这样做,则不会分配值。

另一方面,网站上的示例代码可以使用或不使用this->

为什么会这样?

2 个答案:

答案 0 :(得分:5)

问题是该函数的参数与该类的名称相同,因此除非您使用this,否则编译器不知道您正在讨论哪一个。您可以通过更改变量的名称来解决此问题,也可以使用成员初始化列表

Person::Person (int age, std::string name) : name(name), age(age) {}

作为一个注释,我喜欢使用与类变量相同的名称,但在名称后添加_以使其不同。所以在这种情况下我会做到:

Person::Person (int age_, std::string name_) : name(name_), age(age_) {}

这样可以更容易区分类成员和构造函数参数。

答案 1 :(得分:1)

Person::Person (int age, std::string name){

// This is the part :
   this->age = age;
   this->name = name;

}

因为您的私有变量名为name,而您发送的变量也称为name,所以您使用this-&gt;指定您正在使用的名为name的变量。