程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深刻懂得c++常成員函數和常對象

深刻懂得c++常成員函數和常對象

編輯:關於C++

深刻懂得c++常成員函數和常對象。本站提示廣大學習愛好者:(深刻懂得c++常成員函數和常對象)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻懂得c++常成員函數和常對象正文


先明白幾個概念:

1. 常對象只能挪用常成員函數。

2. 通俗對象可以挪用全體成員函數。

3. 當對一個對象挪用成員函數時,編譯法式先將對象的地址賦給this指針,然後挪用成員函數,每次成員函數存取數據成員時,由隱含應用this指針。

4. 當一個成員函數被挪用時,主動向它傳遞一個隱含的參數,該參數是一個指向這個成員函數地點的對象的指針。

5. 在C++中,this指針被隱含地聲明為: X *const this,這意味著不克不及給this 指針賦值;

在X類的const成員函數中,this指針的類型為:const X* const, 這解釋this指針所指向的這類對象是弗成修正的(即不克不及對這類對象的數據成員停止賦值操作);

6. 因為this其實不是一個慣例變量,所以,不克不及獲得this的地址。

如:

#include <iostream>

class A
{
public:
	A():mValue(0)
	{

	}
	void print() 
	{
		std::cout<<"hello";
	}
	int GetValue()
	{
		return mValue;
	}
	int GetValue()const
	{
		return mValue;
	}

private:
	int mValue;
};

void test(A & const a)
{

}

int main()
{
	
	const A a;//const A* const this ;	
	a.print(); //毛病,將會提醒 error C2662: “A::print”: 不克不及將“this”指針從“const A”轉換為“A &”

	test(a); //error C2664: “test”: 不克不及將參數 1 從“const A”轉換為“A &”
}

因為a是const對象,所以a只能挪用類A中的常成員函數。

那末為何會提醒:“不克不及將this指針.......”的語句呢?

由於關於c++的成員函數(固然不是靜態成員函數),都邑含有一個隱蔽的參數,關於上例A中的int GetValue()函數,在編譯後會釀成:

int GetValue(A * const this);  //不克不及修正this變量,但可以修正this指向的內容,即:this是常量指針。

而關於int GetValue()const ,編譯後是:

int GetValue(const A* const this);

只所以this指針是const類型,由於在某次挪用全部進程this指向都不許可轉變(緣由很簡略,假如轉變的話就不是這個對象挪用的了)

從編譯後的成果看就很清晰了, 由於a是const,所以其this指針就對應: const A* const this ;

而print函數被編譯出來後對應的是void print(A* const this); 在停止參數婚配時, 所以就會提醒 “不克不及將“this”指針從“const A ....."

this指針的湧現就說明了,一切類A的對象都是公用一套代碼模版,為何各個對象在挪用成員函數的時刻不會亂套。

本來C++為成員函數供給了一個名字為this的指針,這個指針稱為自援用指針。每當創立一個對象時,體系就把this指針初始化為指向該對象。每當挪用一個成員函數時,體系就主動把this指針作為一個隱含的參數傳給該函數。分歧的對象挪用統一個成員函數時,C++編譯器將依據成員函數this指針所指向的對象來肯定應當援用哪個對象的數據成員。平日情形下,this指針是隱含存在的,也能夠將其顯示的表現出來(即如上例中的 this->mValue。不外this指針只能在類中應用)

還有就是  this指針是一個const指針,不克不及再法式中修正它或給它賦值;

以上這篇深刻懂得c++常成員函數和常對象就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved