c 函式返回引用的問題

2021-08-03 02:55:09 字數 2397 閱讀 4709

這兩天寫vec時遇見返回引用的問題,覺得之前對這個問題的理解不夠深入。所以,本文進一步討論下我對這個問題的理解。

本文參考了[c++函式返回引用]一文,此文寫的較為清楚,大家可以直接參看此文。

過載vec的運算子時的介面如下:

t& operator( size_type i ) 

const t& operator( size_type i ) const

首先,這兩個介面標籤「看起來」一樣,為什麼能過載?

其次,第乙個函式並沒有該錶物件的狀態,為什麼不寫成如下形式:

t& operator( size_type i ) const //實際上,這個介面編譯過不去,原因後面說。
先回答第乙個問題,這兩個介面函式的引數列表看起來一樣,實際不一樣,因為成員函式的第乙個引數是預設的,並且第二個函式有const的限制,所以,還原後的介面如下:

t& operator( t* this, size_type i ) 

const t& operator( const t* this, size_type i ) const

這麼看,這兩個函式的標籤就不一樣了。

現在來回答第二個問題。首先需要明白一點的是,為什麼要過載?如果不過載其實是不存在這個問題的。過載的原因是因為,存在常物件,常物件不能呼叫非const方法,所以,需要乙個const版本的運算子。所以,這個版本必須得有。那麼問題來了,如果第乙個方法寫成const,那麼它和第二個方法的引數列表又變成一樣的,此時,過載失敗。並且,再仔細觀察下面的這個介面:

t& operator( size_type i ) const //實際上,這個介面編譯過不去,原因後面說。
這個編譯為什麼過不去,因為,這個介面還原之後如下:

t& operator( const t* this, size_type i ) const //實際上,這個介面編譯過不去,原因後面說。
當函式返回引用型別的時候,沒有複製返回值,而是返回物件的引用(即物件本身)。函式返回引用:實際上是乙個變數的記憶體位址,既然是記憶體位址的話,那麼肯定可以讀寫該位址所對應的記憶體區域的值,即就是「左值」,可以出現在賦值語句的左邊。

所以,上面的介面,可以這麼看:

t& operator = this->data[i]; // 先假設這麼看
左邊是乙個引用,右邊是乙個常量,你不能用乙個非常引用去繫結乙個常量。

所以,從是否能過載以及語法本身來說,都不能那麼寫。

結論:const成員函式如果返回引用,必須返回常引用。

所以,這個地方不能教條,規則是沒有錯,但不能迷信規則,錯的是用的人不分青紅皂白濫用規則就會出現問題。

看下面這段**:

#include 

#define n 3

int arr[n];

int& f( int* arr, int i )

const

int& f( const

int* arr, int i )

int main( void );

int tmp = f( arr1, 0 );

return

0;}

t& operator( size_type i ) 

const t& operator( size_type i ) const

上面說明了,常成員函式,如果返回引用,必須返回常引用。因為在常成員函式體內,返回的物件是常量,所以,必須得用常引用去繫結。

但是,常指標,常引用都是可以繫結非常量的,此時通過常引用和常指標是不能修改變數,但是非常量本生可以被修改。

那麼,我的問題是,第乙個函式可不可以省略,只保留第二個,也就是只存在如下的形式。

const t& operator( size_type i ) const
可以,但是這樣會無法無法進行寫操作。對於非常量來說,常指標可以繫結非常量物件,然後通過常指標,返回常引用,這都是沒問題的。但是,雖然物件是非常量,但是通過常指標和常引用是不能修改的。所以,非常量肯定可以呼叫這個函式,但是,由於返回常引用,無法進行寫操作。這與非常量的語義想違背,所以,第乙個過載函式不能省。

#include 

#define n 3

int& f( int* arr, int i )

const

int& g( const

int* arr, int i )

int main( void )

c 函式返回引用

1 什麼是引用?引用就是變數的別名,操作乙個變數的引用也就相當於操作變數本身,這一點跟指標很類似,但是操作引用不用像操作指標一樣,利用取位址符號,很不方便。而操作引用的話,則跟操作普通變數一樣,所以c 之中更加鼓勵使用引用。2 c 函式為什麼要使用引用?c語言之中大量利用指標作為形參或者函式返回值,...

C 函式返回引用

首先需要明白 c 函式為什麼要返回引用?答 這樣就不用返回結果的副本。因為返回副本需要做賦值拷貝函式,浪費時間。這時候,實際上,返回是結果的副本,而不是結果本身。如果要返回本身,就返回引用就ok了。例1 const string manip2 const string s 此時,返回的不是ret本身...

c 函式返回引用

一,c 函式的返回分為以下幾種情況 1 主函式main的返回值 這裡提及一點,返回0表示程式執行成功。2 返回非引用型別 函式的返回值用於初始化在跳用函式出建立的臨時物件。用函式返回值初始化臨時物件與用實參初始化形參的方法是一樣 的。如果返回型別不是引用,在呼叫函式的地方會將函式返回值複製給臨時物件...