1. 程式人生 > >This 指標和const 修飾This指標

This 指標和const 修飾This指標

一、This指標

每個物件都維護自己的一份資料,而成員函式定義是所有物件共享的。

以下兩段程式是c++編譯器對普通成員函式的內部處理

This指標是一個常量,含有當前實施呼叫的物件的地址

class Test
{
public:
	Test (int i)
	{
		mI = i;
	}
	int getI()
	{
		return mI;
	}
	static void Print()
	{
		printf("This is class Test.\n");
	}
protected:
private:
	int mI;
};
Test a(10);
a.getI();
Test::Print();
void Test_initilize(Test* pThis,int i)
{
	pThis->mI = i;
}
int Test_getI(Test* pThis)
{
	return pThis->mI;
}
void Test_Print()
{
	printf("This is class Test.\n");
}

Test a;
Test_initilize(&a,10);
Test_getI(&a);
Test_Print();

問題??

      呼叫成員函式時,如何知道是對那個物件進行資料操作呢

每個成員函式都有一個隱含的引數,指向接收訊息的物件 稱為

This指標

This的作用:

(1) 用來區分與區域性變數重名的資料成員

(2)返回當前物件

(3)  返回當前物件的地址

沒學This指標的時候需要這樣

class 
{
public:
	int getA(int _a,int _b)
	{
		a = _a;
		b = _b;
	}
protected:
private:
	int a;
	int b;
};
使用This指標是:
class 
{
public:
	int getA(int a,int b )
	{
		this->a = a;
		this->b = b;
	}
protected:
private:
	int a;
	int b;
};

class X
{
	int m;
public:
	void setVal(int m)
	{
		this->m = m;//區分與函式引數重名的資料成員
	}
	X& add(const X& a)
	{
		m += a.m;
		return *this;//返回當前物件
	}
	void copy(const X& a)
	{
		if(this == &a)
		{
			return;
			m = a.m;//拷貝操作
		}
	}
protected:
private:
};


#include<iostream>
using namespace std;

class Test
{
public:
	Test(int a,int b)//實質是Test(Test *this,int a,int b)
	{
		this->a = a;
		this->b = b;
	}
	void printT()
	{
		cout<<"a:"<<a<<endl;
		cout<<"b:"<<this->b<<endl;
	}
	//1 const 寫在什麼位置 沒有關係
	//2 const 修飾的是誰?
	//3 const 修飾的是形參 a 嗎?--不是
	//4 const 修飾的是屬性 this-a this-b?--不是
	//實質是:void  OpVar(const Test *this int a,int b) 
	//void  OpVar(const Test *const this int a,int b) 更精確的寫法
	//const 修飾的是this指標,指標指向的記憶體的空間不能修改
	void  OpVar(int a,int b) const//一般寫在後邊
	{
		a = 100;
		this->a = 100;
		this->a = 100;
		//cout<<"a:"<<a<<endl;
		cout<<"b:"<<this->b<<endl;
	}
protected:
private:
	int a;
	int b;
};

int main()
{
	Test t1(1,2);
	t1.printT();//實質是printT(&t1)
	system("pause");
	return 0;
}