1. 程式人生 > >C++學習筆記42——過載操作符之箭頭操作符

C++學習筆記42——過載操作符之箭頭操作符

 箭頭(->)操作符,看起來很像二元操作符,左運算元是類物件,右運算元是類成員,即使如此,箭頭操作符的過載函式是沒有第二個形參的(第一個是隱含形參this),理解起來有點難度;
 函式語句為:
 a->b;(其中,b可以是函式或者成員;)
 步驟1. 如果a是指標,指向一個具有成員b的類物件,那麼a->b返回a型別的成員b,至此,語句結束;

 步驟2. 如果a是一個物件(物件必須重定義了“operator->”,否則報錯),那麼就呼叫a的operator->()函式,返回值:如果是指標則繼續執行步驟1,如果是物件則繼續執行步驟2,直到最終走到指標結束。 

與此相對應,過載的箭頭操作符的返回型別,只能是以下兩種:

(1)返回指向類型別的指標;

(2)返回定義了自己的箭頭操作符的類型別的物件;

示例:

/*******************************************************************/
//   過載箭頭操作符
/*******************************************************************/
//類的定義,只有成員函式,沒有資料成員
class A
{
public:
	void Printf() { cout << "I am A " << endl; }
};
class B
{
public:
	void Printf() { cout << "I am B " << endl; }
	A* operator->() { return &m_A; }
private:
	A m_A;
};
class D
{
public:
	void Printf() { cout << "I am D " << endl; }
	B* operator->() { return &m_B; }   // 返回(&m_B)的解引用
private:
	B m_B;
};
class E
{
public:
	void Printf() { cout << "I am E " << endl; }
	B& operator->() { return m_B; }      // 返回 m_B 的引用
private:
	B m_B;
};

//主函式
int main()
{
	D d;
	B b;
	d->Printf();	 // I am B
	d.operator->()->Printf(); // I am B
	d->operator->()->Printf(); // I am A
	E e;
	e->Printf(); // I am A
	b = e.operator->(); //OK
	//b = e->();//error!
	//b = e->;//error!
	b.Printf(); // I am B 呼叫B自身的成員函式
	b->Printf();// I am A 先返回A,再指向A的成員函式
}

解析:
1.  d->Printf();   d是物件,執行d的“opterator->()" 成員函式,函式返回B*,即B類的指標,執行步驟1,執行Printf()成員,輸出"  I am B";
2.  d.operator->()->Printf(); 等價於d->Printf();語句,
3.  d->operator->()->Printf();  按照結合性,劃分執行循序:((((d->)operator->())->)Printf());  (d->)中d是物件,執行d的“opterator->()" 成員函式,函式返回B*(pB)指標; 接著按照步驟1執行pB的operator->() 成員函式,返回A*(pA)指標,pA->Printf();pA是指標,按照步驟1執行pA的成員函式Printf(),輸出" I am A"
4.  e->Printf();  e是物件,執行e的“opterator->()" 成員函式,函式返回B&(b),b是物件,再次執行b的“opterator->()" 成員函式,返回A*(pA)指標,按照步驟1,執行函式Printf(),輸出 “ I am A ”;

相關推薦

C++學習筆記42——過載操作符箭頭操作符

 箭頭(->)操作符,看起來很像二元操作符,左運算元是類物件,右運算元是類成員,即使如此,箭頭操作符的過載函式是沒有第二個形參的(第一個是隱含形參this),理解起來有點難度;  函式語句為:  a->b;(其中,b可以是函式或者成員;)  步驟1. 如果a是指

c學習筆記--1基本輸入輸出與操作符

好久之前的了,學習c語言的筆記。 依舊是老套路,從基礎的變數型別,到函式定義一步步學起 #include <string.h> #include <stdio.h> //printf函式是一個標準庫函式,它的函式原型在標頭檔案“stdio

C++學習筆記(11) 過載流插入運算子和流提取運算子,以及自動型別轉換

1. 過載<< 和>>運算子 <<和<<運算子可以被過載用於輸入輸出操作,在上一節中,我們對Rational物件進行輸出時定義了toString()類成員函式。如何通過cout << r 直接輸出Rational物件: 對於: r1

C#學習筆記第四篇Equals,GetHashCode ,ToString函式深度剖析(二)

 C#學習筆記第四篇之Equals,GetHashCode ,ToString函式深度剖析(二) 上一篇詳細搞了Equals,這一篇重點說下GetHashCode函式有什麼用,怎麼用,在哪裡用,用的時候注意什麼。 然後簡要說下ToString的意義所在,因為比較簡單

c++學習筆記運算子的過載

運算子的過載包括雙目運算子+的過載和輸入輸出流運算子的過載。 程式碼的功能是實現2行3列矩陣的加法 程式碼如下 #include<iostream> using namespace std; class matrix { public: matrix(); frie

C++學習筆記(七)--操作符過載 友元函式 類的繼承 訪問控釋protected

C++ Primer Plus的閱讀大概到這邊也就先暫時告一段落了(因為開學了!!) 然後近期找來了C++ Primer稍微翻了翻覺得確實寫得比Plus要好一些,而且加入了C++11的新特性,但是無論哪本書對於這些最基本的功能應用大抵也是差不多的,所以也沒覺得看的是Plu

c#學習筆記Application.DoEvents應用

box nbsp net replace 運算 技術 oop blank 假死 Visual Studio裏的摘要:處理當前在消息隊列中的所有 Windows 消息。 交出CPU控制權,讓系統可以處理隊列中的所有Windows消息 比如在大運算量循環內,加Applicati

[C#學習筆記異步編程模式2]BeginInvoke和EndInvoke方法 (轉載)

cti otf 函數返回 編程模式 catch 數值 gin 單線程 blog 為什麽要進行異步回調?眾所周知,普通方法運行,是單線程的,如果中途有大型操作(如:讀取大文件,大批量操作數據庫,網絡傳輸等),都會導致方法阻塞,表現在界面上就是,程序卡或者死掉,界面元素不動了,

C++學習筆記泛型算法

vector ace sort clu 算法 clas uniq bits 有時 先貼個代碼 有時間的再補筆記 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //模板類在接收

設計模式C++學習筆記十三(Decorator裝飾模式)

com img c++ 進行 done 設計 out set 筆記 裝飾模式,動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。 13.1.解釋 main(),老爸 ISchoolReport,成績單接口 CFourthGrad

Effective C++學習筆記explicit

rom const ack 聲明 col 這樣的 隱式轉換 轉換 類型 關鍵字:   explicit意思為“明確的”和“清楚的”,是C++的關鍵詞,意在阻止隱式類型的轉換; 使用原因:   有時候不合法的隱式轉換,會讓乖巧聽話的程序變得不可控。所以適當地使用expli

Python學習筆記文控制流混合布爾和比較操作符

-- 分別是 == inf 技術分享 mage bubuko 表達式 ima 隨筆記錄方便自己和同路人查閱。 #------------------------------------------------我是可恥的分割線-----------------------

C++學習筆記

() 利用 在一起 忘記 構造函數 end 會同 筆記 允許 9.3.3為何所有的析構函數都應該聲明為 virtual 的?如果使用delete刪去一個實際指向派生類的基類指針,析構函數調用鏈就被破壞。這導致後面使用parent 的指針訪問child 對象並刪去對象時,就

C++ 學習筆記——輸入和輸出

根據 也會 指向 http 對象 是否 取消 成員函數 輸入輸出 在 C++ 中,我們通過調用輸入輸出流庫中的流對象 cin 和 cout 來實現輸入和輸出。 #include <iostream> using namespace std; int ma

函式的過載C++學習筆記 9)

C語言不允許過載   在傳統C語言中,函式名必須是唯一的,也就是說不允許出現同名的函式,   例如,當要求編寫求整數、長整型數和雙精度數的二次方的函式時,若用C來處理,必須編寫3個函式,這3個函式的函式名不允許同名。例如:   Isquare( int i );   //求整數的二次方   

c++學習筆記多檔案操作

每天進步一點點,努力奮鬥的小菜鳥。 曾經搞了好多次的C語言多檔案操作,都沒搞成功,昨天晚上終於搞成功了,雖然是簡單到爆的操作,但我還是挺高興的,哈哈哈。貼出來一方面怕自己忘,一方面若有初學者看到希望能對他們有點小小的幫助。現代數字訊號處理快要考試了,現在慌得一批,估計兩週以內會減少程式設計的時間

c++學習筆記成員函式

學了c++才知道什麼是面向物件什麼是面向過程。幼稚的我曾經還覺得c++和C語言差不多,接觸之後才知道c++是多麼的難,光類和物件這個知識點就看了一天。什麼建構函式解構函式,物件陣列物件成員弄得我頭大,現在才知道為什麼老師說c++是最難的語言,學c++就是在地獄裡磨鍊,從地獄出來就是天堂,會有會當凌絕

C++ 學習筆記——檔案操作和檔案流

1. 檔案的概念 對於使用者來說,常用到的檔案有兩大類:程式檔案和資料檔案。而根據檔案中資料的組織方式,則可以將檔案分為 ASCII 檔案和二進位制檔案。 ASCII 檔案,又稱字元檔案或者文字檔案,它的每一個位元組放一個 ASCII 程式碼,代表一個字元。 二進位制檔案,又稱內部格式檔案或位元

C++學習筆記——名稱空間&預設引數&函式過載&引用

C++學習筆記——名稱空間&預設引數&函式過載&引用 戳這裡:我的印象筆記原連結 C++: 1.解決C語言中設計不好或者使用不是很方便的語法—>優化 2.增加新的語法特性 注:extern “C”:在C++工程中,將程式碼按照C語言的風格來編譯

C# 學習筆記 實參與形參

學習筆記 ole ews 返回 它的 參數 參與 line 方法 一,形參   聲明是在方法的參數列表中,它的功能是:     ①可以返回一個或多個值給調用代碼;     ②在方法執行的時候就把數據傳入方法; 二,實參   實參位於方法調用的參數列表中,實參的值用來