日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 函数的引用返回值

發布時間:2025/3/21 c/c++ 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 函数的引用返回值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C++ 函數的引用返回值 2009-09-17 09:29

引用是給變量取一個別名,所以引用傳遞會直接進行變量本身的傳遞。它的最大好處是可以把別處對變量的改變保留下來,第二好處是它提高了性能:如果函數的返回值是一個引用,那么,如上文所說,它會節約一組構造、賦值和析構過程。但是,函數返回引用往往會帶來一些意想不到的錯誤:比如返回臨時變量的引用。
//一個錯誤的函數
int &Max(int i, int j)
{
  return i>j ? i : j;
}
  以上函數的錯誤在于,i和j在函數結束后會被釋放。對它們的引和也將失效。如果用這個返回值給別的變量賦值,將會獲得一個垃圾。VC++.Net會對以上return語句顯示警告。
  那么,如果返回一個全局變的引用呢?這當然是可以的,但是,一來程序設計中不建議使用過多的全局變量,二來全局變量即使不返回也可以訪問。這樣做的唯一用途就是把函數做右值來給其它變量賦值。
int m;//全局變量
int &MaxByGlobal(int i, int j)
{
  return m = i>j ? i : j;
}
int a, b, c;
c = MaxByGlobal(a, b);//用法一、用返回值賦值
MaxByGlobal(a, b); c = m;//用法二、不用返回值賦值
  當然,以上這個MaxByGlobal函數也不是一無是處,能用返回值來進行賦值會給程序帶來更好的可讀性。只是這樣的函數設計本身不被建議。
  那么,函數返回引用用得最多的就是返回形參了。因為形參可以用引用傳遞,引用的形參不是函數內部的局部變量,這樣做是可取的:
int &MaxByRef(int &i, int&j)
{
  return i>j ? i : j;
}
  上面這個函數和上文中的“int Max(int i, int j)”函數如此相似,但是它省去了三次構造、賦值和析構。
  另外一種用法就是在類的成員函數中返回類對象自身了,典型的是“operator +=”函數之類。
MyClass &MyClass::operator +=(const MyClass&other)
{
  //某些語句
  return *this;
}
  以上函數返回的是自身的引用。因為類的成員函數也可以寫成全局函數“MyClass &operator+=(MyClass &Left, const MyClass&right)”,而且在類成員函數的調用中實際存在著this指針的傳遞。所以,以上這個函數依然可以看作返回了形參的引用。
  對于返回引用的函數,還有一個好玩的現像。即返回值還可能可以被賦值。如“(a += b) =c;”這樣的形式。這種寫法明顯不倫不類,但是如果函數返回了非const的引用,這個表達式的確是合理的。所以,上面的“operator+=”函數還要修改一下,將返回值由“MyClass&”改為“constMyClass&”。
  返回引用并不是處處可用的,正如《引用傳遞的應用范圍》中提到的一樣:不能用引用來傳遞臨時值。有時候我們的確要產生一個臨時對象并返回它,那就不能返回引用。典型的有“operator+”函數:
const MyClass MyClass::operator +(const MyClass&other) const
{
  MyClass Temp;
  //某些語句
  return Temp;//這里只能返回對象,因為Temp必須是局部變量
}

利用引用作為函數的形參可以在調用函數的過程中不是用傳遞值的方式進行虛實結合,而是通過傳址方式使形參成為實參的別名,因此不生成臨時變量(實參的副本),減少了時間和空間的開銷。此外,如果重載函數的返回值是對象的引用時,返回的不是常量,而是引用所代表的對象,它可以出現在賦值號的左側而成為左值(leftvalue),可以被賦值或參與其他操作(如保留cout流的當前值以便能連續使用“<<”輸出)。

例如可以這樣定義String 類
String &String::operator =(const String&other)???

{??


if(this == &other)
return *this;


delete [] m_data;

int length =strlength(other.m_data);???
m_data = newchar[length+1];???????
strCopy(m_data, other.m_data);

return *this;
}

總結

以上是生活随笔為你收集整理的C++ 函数的引用返回值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。