C++this指针和函数调用

C++this指针和函数调用

之前对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 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则是为了保证这个指向不会被改变,防止被置空。
例:

	int Area()const//面积函数
	{
	    this=NULL;
		int c = this->m_wide * this->m_high;//此时就会报错
		return c;
	}

函数调用:
主函数执行顺序:
1、先通过构造函数构造对象a和b(this指针先指向a再指向b);
2、a=a.Area(),表面上看是对象调用函数,实际上编译器在执行时是这样执行的“a=Area(&a)”,形参为对象的地址,然后this指针通过此对象的地址去读取此对象所初始化的成员变量数据,如下:

    int Area(/*Rectangle *const this*/)
	{
		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了。
所以,函数的执行结果就是这样:
C++this指针和函数调用_第1张图片
为了方便大家理解,我对执行结果稍做改变:
假定临时对象为tmp;

Create succeed  &a
Create succeed  &b
Copy Create Rect:&c
Copy Create Rect:&tmp
~Rect:&c
等号运算符重载
~Rect:&tmp
~Rect:&b
~Rect:&a

你可能感兴趣的:(学习心得,1024程序员节)