1. 程式人生 > >C++----this指標

C++----this指標

c++通過提供特殊的物件指標,this指標,解決上述問題。This指標指向被呼叫的成員函式所屬的物件。

c++規定,this指標是隱含在物件成員函式內的一種指標。當一個物件被建立後,它的每一個成員函式都含有一個系統自動生成的隱含指標this,用以儲存這個物件的地址,也就是說雖然我們沒有寫上this指標,編譯器在編譯的時候也是會加上的。因此this也稱為“指向本物件的指標”,this指標並不是物件的一部分,不會影響sizeof(物件)的結果。

   this指標是C++實現封裝的一種機制,它將物件和該物件呼叫的成員函式連線在一起,在外部看來,每一個物件都擁有自己的函式成員。一般情況下,並不寫this,而是讓系統進行預設設定。

      this指標永遠指向當前物件。

 

成員函式通過this指標即可知道操作的是那個物件的資料。This指標是一種隱含指標,它隱含於每個類的非靜態成員函式中。This指標無需定義,直接使用即可。

注意:靜態成員函式內部沒有this指標,靜態成員函式不能操作非靜態成員變數。

//this指標:

class Person1
{
public:
	int age;
	Person1(int age)
	{
		age = age;
	}

};

void test01()
{
	Person1 p1(10);

	cout << "p1的年齡" << p1.age << endl;

}

//輸出為 地址亂碼;
//類中的age變數名相同,沒有區分;

//區分:

class Person2
{
public:
	int age;
	Person2(int age)
	{
		this ->age = age;
	}

};
//this解決命名衝突;
void test02()
{
	Person2 p1(10);

	cout << "p1的年齡" << p1.age << endl;

}
//此時編譯器可以區分類中的變數;
class Person3
{
public:
	int age;
	Person3(int age)
	{
		this->age = age;
	}
	//年齡比較
	void compareAge(Person3 &p)
	{
		if (this->age == p.age)
			cout << "年齡相等" << endl;
		else
			cout << "不相等" << endl;
	}

};

void test03()
{
	Person3 p1(10);
	Person3 p2(10);

	p1.compareAge(p2);

}

//年齡相加

class Person4
{
public:
	int age;
	Person4(int age)
	{
		this->age = age;
	}
	//年齡比較
	void compareAge(Person4 &p)
	{
		if (this->age == p.age)
			cout << "年齡相等" << endl;
		else
			cout << "不相等" << endl;
	}

	void plusAge(Person4 & p)
	{
		this->age += p.age;
		cout << this->age << endl;
	}
};

void test04()
{
	Person4 p1(10);
	Person4 p2(10);

	p1.plusAge(p2);

}

//鏈式程式設計返回引用:

class Person5
{
public:
	int age;
	Person5(int age)
	{
		this->age = age;
	}
	//年齡比較
	void compareAge(Person5 &p)
	{
		if (this->age == p.age)
			cout << "年齡相等" << endl;
		else
			cout << "不相等" << endl;
	}

	Person5& plusAge(Person5 & p)//函式返回引用可以做左值
	{
		this->age += p.age;
		cout << this->age << endl;

		return *this;//指向物件的本體;
	}
};


void test05()
{
	Person5 p1(10);
	Person5 p2(10);

	p1.plusAge(p2).plusAge(p2); //相當於連加,鏈式程式設計思想。
	//所以前一個需要返回類物件的本體,即:return *this;
	//this永遠指向當前物件;
}


int main()
{
    test01();
    test02();
    test03();
    test04();
    test05();


    return 0;
}