C++进阶-指向自身的 this 指针

指向自身的 this 指针

既然各个对象都使用同样一份成员函数代码,那么在成员函数之中,如果要对各个具体对象的成员变量进行访问,又如何找到这个成员变量所属的具体对象呢?例如,有这样一个简单的类:

class Base
{
	public:
		// 成员函数访问成员变量
		void SetValue( int nVal )
		{
		m_nVal = nVal;
		}
	// 类的成员变量
	private:
		int m_nVal;
};

在这个类的 SetValue()成员函数中,我们利用参数对成员变量进行赋值。现在就创建相应的对象调用其成员函数:

// 创建对象
Base aBase;
// 调用成员函数对成员变量进行赋值
aBase.SetValue( 1 );

当需要访问类的成员变量时,总是要指明该类的一个具体实例对象,编译器才会知道它要访问的到底是哪个对象的成员变量,进而才知道该成员变量在内存中的什么地方。
this 是 C++中的一个关键字,在类的成员函数中,它代表着指向当前对象自身的指针,而成员函数中的成员变量就是通过 this 指针找到自己所属的对象的。

class Base
{
	public:
		// 成员函数访问成员变量
		void SetValue( int nVal )
		{
		// 显式使用 this 指针访问成员变量
		this->m_nVal = nVal;
		}
	// …
};

类成员函数中的成员变量前都有一个 this 指针。当通过某个对象调用它的成员函数时,系统会隐式地传递给成员函数一个指向这个对象自身的指针,这就是 this 指针。当在成员函数中通过 this 指针访问类的成员变量时,这时 this指针指向的是调用这个函数的对象,所以对成员变量的访问也就变成对这个对象所属的成员变量的访问。

事实上,类的每个非静态成员函数(没有 static 关键字修饰的成员函数, 必须通过某个实例对象调用) 中都隐式地声明了 this 指针参数,该指针指向调用该成员函数的对象。利用该指针,在成函数中可以访问到该对象的所有成员变量和成员函数。

class Base
{
	public:
	// 在成员函数中通过 this 指针访问类的成员
	int ChangeValue( int nVal )
	{
		// 通过 this 指针访问成员函数
		this->SetValue( nVal )
		// 通过 this 指针访问成员变量
		return this->m_nVal;
	}
	// …
};

在实际开发中,通过 this 指针访问类的成员并没有多大意义,因为编译器在编译代码的时候会自动给成员函数中对类成员的访问加上 this 指针。更多时候, this 指针用来返回指向对象本身的指针以实现对象的链式引用,或者避免对同一对象进行自赋值操作。例如:

// 描述一个点位置的类
class Point
{
	public:
		Point( int x, int y ): m_nX(x), m_nY(y)
		{};
		// 重载赋值操作符“=”,进行赋值操作
		void operator = (const Point& pt)
		{
		// 判断传递进来的参数是否是这个对象自身
		// 如果是同一对象,则不进行赋值操作
		if( this != &pt )
		{
			m_nX = pt.m_nX;
			m_nY = pt.m_nY;
		}
		}
		// 移动点的位置
		Point& Move( int x, int y )
		{
		m_nX += x;
		m_nY += y;
		// 返回对象本身,这样可以利用函数返回值进行链式引用
		return *this;
		}
	private:
		int m_nX;
		int m_nY;
};
自从用了 this 指针之后, Point 类腰也不酸了,背也不疼了,爬坡也更有劲了:
Point pt1(2,4);
// 自己赋值给自己,这不明摆着瞎耽误工夫吗?this 指针是不答应的
pt1 = pt1;
// 移动一下,再移动一下
// 通过返回对象本身实现对象的链式引用
pt1.Move(1,1).Move(2,4);

你可能感兴趣的:(C++基础,c++,指针)