首先,类是一种抽象数据类型,也是一种数据类型,因此this指针即是指向 “调用成员函数的类对象” 的指针,解引用即得到指针指向的类对象,也可以访问类对象的成员。
只要类对象调用一个成员函数,编译器即会自动用该对象的地址初始化this指针,因此在成员函数内部,可以直接使用“调用该成员函数的类对象”的成员,而无需再使用成员访问运算符。
this指针的使用:
- 成员函数内部,直接使用“调用该成员函数的类对象”的成员;
- 返回调用成员函数的对象;
- 显式访问“调用成员函数的对象”的成员变量和成员函数,如 item—>bookNo (此时多用于成员变量和形参名字相同时)
//成员函数定义
sales_data& sales_data::combine(const sales_data& rhs) {
//units_sold是调用该成员函数时,this隐式指向的成员变量,rhs.units_sold是实参类对象的成员变量
//调用时相当于两个类对象的操作,如total.combine(trans); total为调用的对象,有this。
//因此相当于total.units_sold += rhs.units_sold;
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this; //this指向“调用该成员函数类对象”,解引用即返回该类对象
}
若主函数中调用该成员函数
item1.combine(item2);
sales_data item1,item2;
此时item1调用combine成员函数,实参为item2。当item1调用combine时,this即指向item1对象,因此在combine成员函数内部直接使用item1的成员变量;实参为item2,先初始化形参rhs,然后需要使用成员访问运算符访问成员。
一个比较通俗的解释:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,也可以擦桌子,洗地板等,
但是房子你是看不到全貌了。
你可以看见桌子、椅子、地板等,也可以擦桌子,洗地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。