class Person
{
public:int m_A;//非静态成员变量,属于对象上void func(/*Person * this*/){}; //非静态成员函数 不属于对象身上static int m_B;//静态成员函数,不属于对象上static void fun2(){};//静态成员函数 ,不属于对象身上//double m_C;//12错误 16正确,解决方法#pragma pack(1)
};
void test02()
{//this指针指向被调用的成员函数Person p1;p1.func(); //编译器会偷偷 加入一个this指针 Person * this Person p2;p2.func();
}
C++编译器给每个“成员函数“增加了一个隐藏的指针参数,让该指 针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访 问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针使用
- 指针永远指向当前对象
- 解决命名冲突
- *this指向对象的本体
- 非静态成员函数才有this指针
this指针的类型:
-
类类型* const
-
只能在“成员函数”的内部使用
-
this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
-
this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户 传递
#include<iostream>using namespace std;// this 可以解决命名冲突class Person{public:Person(int age){this->age = age;}//对比年龄void compareAge(Person &p){if (this->age == p.age){cout << "相等" << endl;}else{cout << "不相等" << endl;}}//年龄相加Person& PlusAge(Person &p){this->age += age;return *this; //*this指向对象的本体}int age;};void test01(){Person p1(10);cout << "p1的年龄" << p1.age << endl;Person p2(10);p1.compareAge(p2);p1.PlusAge(p2).PlusAge(p2);//链式编程//函数返回值作为左值 返回引用cout << "p1的年龄" << p1.age << endl;}int main(){test01();system("pause");return 0;}