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