为什么教程页面中的示例在构造函数中没有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->
为什么会这样?
答案 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的变量。