之前对this指针只是有所耳闻,但当真正使用时确是半知半解,今天有幸听了一位老师的详细讲解,总算是搞懂了了它,下面我将我的学习笔记分享给大家,希望对大家理解this指针有所帮助。
下面是一个求矩形面积的程序,以这个程序为例,来做this指针和函数调用的介绍
#include#include using namespace std; class Rectangle { private: int m_wide; int m_high; public: Rectangle(int w = 0, int h = 0) :m_wide(w), m_high(h)//构造函数 { cout << "Create succeed" << endl; } ~Rectangle() //析构函数 { cout << "~Rect" << endl; }; int Area()const//面积函数 { int c = m_wide * m_high; return c; } Rectangle(const Rectangle& x):m_wide(x.m_wide), m_high(x.m_high)//拷贝构造函数 { cout << "Copy Create Rect :" << endl; } Rectangle dup()//复制函数 { Rectangle c(*this); return c; } Rectangle& operator=(const Rectangle& src)//等号运算符重载 { cout << "等号运算符重载" << endl; return *this; } }; int main() { Rectangle a(12, 23), b; int c = a.Area();//a=Area(&ar) b = a.dup(); return 0; }
首先说明this指针的作用:为了区分同一类的不同对象,从而达到不同对象可以共享同一个类的方法区
一个类的成员方法都存储在栈区,而一个类可以构造多个对象,在调用成员方法时,为了区分到底是哪个对象在调用,就需要用this指针指向这个调用的对象,而const this则是为了保证这个指向不会被改变。
函数调用:
主函数执行顺序:
1、先通过构造函数构造对象a和b(this指针先指向a再指向b);
2、a=a.Area(),表面上看是对象调用函数,实际上编译器在执行时是这样执行的“a=Area(&a)”,形参为对象的地址,然后this指针通过此对象的地址去读取此对象所初始化的成员变量数据,如下:
int Area()
{
int c = this->m_wide * this->m_high;
return c;
}
3、接下来看“b = a.dup();",这一步为等号运算符重载函数(稍后将做解释),之前我们说编译器对这样的函数是以“b=dup(&a)”来实现的,而a是已经存在的对象,所以在dup函数内部,我们执行到“Rectangle c(*this);”时,就是用一个已经存在的对象去构造一个新的对象,也就是拷贝构造函数,这里我们没有定义拷贝构造函数,系统会生成一个默认拷贝构造函数。在执行到“return c”时,会再一次调用拷贝构造函数构造一个临时对象,用来存放c(为什么要构造临时对象呢?因为dup函数执行完成之后,函数所开辟的空间就销毁了,对象c也随之销毁,所以必须构造一个临时对象来存放c),dup函数执行结束之后,第一次调用拷贝构造函数生成的对象c必须马上析构,在临时对象将返回值赋值给b之后(这一步为等号运算符重载,因为等号左右的对象都已经存在,不是在构造新的对象),临时对象随之也被析构,接下来就是析构a和b了。
所以,函数的执行结果就是这样:
为了方便大家理解,我对执行结果稍做改变:
假定临时对象为tmp;
Create succeed &a Create succeed &b Copy Create Rect:&c Copy Create Rect:&tmp ~Rect:&c 等号运算符重载 ~Rect:&tmp ~Rect:&b ~Rect:&a



