1樓:頓建設容鸞
1.指的是你返回乙個指向區域性變數的引用,包括引數。
2.b是int型別,auto在c++中是乙個廢棄的關鍵字,不過在c++11中被重新啟用,用來自動推導型別。e是乙個引用型別,即可以想象成就是被引用的物件,所以當你取e的位址時,其實獲得的是被引用的物件位址。
由於你的e引用的是乙個區域性變數,也就是棧上的變數,因為棧的起始位址一般都會隨機變化,所以你會得到不一樣的結果。隨機變化的原因是為了防止某些型別的攻擊,提高程式安全性。
3.c++中不存在static型別一說,static是用來指示變數的生命週期型別,即靜態生命週期。我想你是想說b是static
int。當為static
int時,程式啟動時就會將b初始化為40,此時一直持續到程式結束,所以此時返回引用是合法,因為編譯器保證,該變數生命週期會持續整個程式執行期間。
e2 = f();這裡返回引用,而e2不是引用,所以會進行拷貝初始化,所以e2和f()返回的引用是兩個物件。e2為40。
f()=10;這裡由於返回引用,而引用指向static
intb,所以會對b進行修改,於是b變為10。
e2是main的區域性變數,e是引用,f()返回值是引用,此時e等價於f()。當取位址時,e2的位址將不會等於e的位址,因為他們是兩個物件,兩個物件的位址必然不同(除了乙個類的子物件)。這裡e2是區域性變數,所以分配在棧上,而e,f()指向的是靜態變數,所以分配在全域性記憶體中。
2樓:輝秀英狄亥
1+2是啊,你說的「鏈式應用」我覺得有些誇張就是連續運用操作符號,比如你用加法操作符return乙個類型別資料,但是你用想使用這個被加後產生的類的成員x,如果你不引用就是a=b+c;a.x,但是如果你引用了就可以(b+c).x,只是因為如果你只是返還乙個值,那麼它只會在棧區開闢一塊資料位址存放零時物件的值,然後把這個臨時物件的值用複製建構函式複製給b,但是你卻不能用它,但是引用是傳位址所以可以用它,有個例子很鮮明能淺顯說明這種區別:
a=3,如果我用3+1,這裡的3就值傳遞情況下的b+c顯然是沒有意義;但是我用a+1就是用意義的,a就是3這個位址的引用,你改變它下面的值是用意義的,只能說這麼多,有些東西還要自己想;
3,更簡單,++a,如果你引用了就是返回了a的位址,此時a已經加1,完全可以,但是如果是a++,你返還的是a加1之前的數值,換句話說此時a已經不是a,而是a+1,但是你如果引用,那麼又是它的位址,而位址下是a+1,那麼後++就和前++沒有任何區別,這樣做是沒有意義的,能明白嗎?
4,你去了當然有用,看你怎麼用了,引用不是強迫你用,但是要看你想實現什麼功能,舉++的例子,你定義函式時必定起傳位址,但是如果你返還不傳引用而是傳值,那麼你想(++a)++,有意義嗎?很顯然沒,應為括號裡的++a是常量,這就和3+1一樣;
5,看了上面的東西,如果你理解了,這個問題就不是問題了,還是位址的問題
c++ 函式返回引用問題
3樓:匿名使用者
指的是你返回乙個指向區域性變數的引用,包括引數。
b是int型別,auto在c++中是乙個廢棄的關鍵字,不過在c++11中被重新啟用,用來自動推導型別。e是乙個引用型別,即可以想象成就是被引用的物件,所以當你取e的位址時,其實獲得的是被引用的物件位址。由於你的e引用的是乙個區域性變數,也就是棧上的變數,因為棧的起始位址一般都會隨機變化,所以你會得到不一樣的結果。
隨機變化的原因是為了防止某些型別的攻擊,提高程式安全性。
c++中不存在static型別一說,static是用來指示變數的生命週期型別,即靜態生命週期。我想你是想說b是static int。當為static int時,程式啟動時就會將b初始化為40,此時一直持續到程式結束,所以此時返回引用是合法,因為編譯器保證,該變數生命週期會持續整個程式執行期間。
e2 = f();
這裡返回引用,而e2不是引用,所以會進行拷貝初始化,所以e2和f()返回的引用是兩個物件。e2為40。
f()=10;
這裡由於返回引用,而引用指向static int b,所以會對b進行修改,於是b變為10。
e2是main的區域性變數,e是引用,f()返回值是引用,此時e等價於f()。當取位址時,e2的位址將不會等於e的位址,因為他們是兩個物件,兩個物件的位址必然不同(除了乙個類的子物件)。這裡e2是區域性變數,所以分配在棧上,而e,f()指向的是靜態變數,所以分配在全域性記憶體中。
4樓:潘家大少
引用是繫結記憶體,意思是乙個引用會鎖定程式的位址空間中某一位址,位址是常量,只有該位址對應的記憶體單元的內容可以變化
這個問題上,先說明乙個原則:函式不要返回乙個臨時變數的引用。因為臨時變數在棧區,函式結束時它的位址空間要**再用,所以接下來這個位址的內容變成不可控。
對於auto b的情況,就觸犯了這個原則,沒有研究的意義。至於為什麼單步執行和一次執行結果不一樣,可能是vc在不同的除錯模式下對位址空間的使用不一樣吧。
b為static的時候,b處於程式的資料段,不在是棧區,因為b不是臨時變數了,所以對b進行賦值後,它的狀態會保留至函式結束。
f()=10是賦值,b是auto時,賦值給棧記憶體;b是static時,賦值給資料段記憶體。
5樓:匿名使用者
首先,永遠不要返回區域性變數的引用。因為區域性變數在函式返回時被**,即這個變數不存在了,所以以後對這個變數的引用都是無意義的,結果是不可預知的,程式很可能會崩潰。因此,也就不解釋這種情形的結果了。
由於靜態變數的宣告週期直到程式結束,所以返回靜態變數的引用是有意義的,而且安全的。下面解釋返回靜態變數的引用的情形:
#include
using namespace std;
int& f()
int main()
c++函式返回引用問題
6樓:匿名使用者
#include
using namespace std;
int a=;
int &index(int i);//這裡需要申明一下 否則main不能呼叫index函式
int main()
{index(2)=25;
cout<
返回引用:
1)主函式main的返回值:這裡提及一點,返回0表示程式執行成功。
2)返回非引用型別:函式的返回值用於初始化在跳用函式出建立的臨時物件。用函式返回值初始化臨時物件與用實參初始化形參的方法是一樣 的。
如果返回型別不是引用,在呼叫函式的地方會將函式返回值複製給臨時物件。且其返回值既可以是區域性物件,也可以是求解表示式的結果。
3)返回引用:當函式返回引用型別時,沒有複製返回值。相反,返回的是物件本身。
7樓:
在main中開頭加一句int &index(int);,或者把函式index的定義提前到main前面就行了……c/c++規定所有變數和函式必須先宣告後引用,前述兩種方法都是在進行函式index的宣告,而寫在main後面的函式被認為是沒有宣告過的,所以你編譯不過。「引用」是c++的一種型別,它是某個變數的別名,比如int a,&p=a;這就是給a又起了個名字叫p,使用p和使用p就是一樣的了。c++為「引用「賦於了新的內涵:
當函式的形式引數使用「引用型別」時,函式內對「引用」的操作可以改變原變數的值,而用變數型別作形式引數時是拷貝傳值,沒有這種優勢。返回」引用「的函式在函式名前加乙個&,再前面是型別名,比如int &index()是返回乙個int型「引用」,因為「引用」是int型某變數的別名,所以返回值可以直接賦給int型變數。
8樓:匿名使用者
int &index(int i)
bug bug bug
不能返回臨時變數的引用
c++中返回引用和返回值的區別
9樓:
通常的返回機制將返回值複製到臨時儲存區域中, 隨後呼叫程式將訪問該區域.
返回引用則程式則呼叫程式將直接訪問返回值.
通常引用將指向傳遞給函式的引用, 因此呼叫函式實際上是直接訪問自己的乙個變數.
比如const int& fun (int& a, const int& b)
int x = 1, y = 2, z;
z = fun(x, y);
//等價於 fun(x, y); z = x;
而且返回引用不能返回函式內部的臨時變數, 因為該變數隨著函式的結束而銷毀, 返回值會毫無意義, 如
const int& fun (int& a, const int& b)
//該程式會崩潰, 因為變數c隨著程式的結束而銷毀, 繼而返回的c的同名物件毫無意義
10樓:嚴棠偉雨筠
如果返回值,那麼記憶體中只有兩個儲存該整形資料的單元,乙個是函式中生成的被返回的整形資料,乙個是接收以後的整形資料,而返回引用則只要一格單元來儲存這個整形資料,被返回的和接收到的都是同乙個整形資料。
c++中為什麼要函式返回引用?
11樓:夫楠考騫仕
1c++標準中沒有所謂的「c++為什麼返回引用的函式的形參也必須是傳引用」的規定。
2在你的例子裡(很奇怪的用法,為什麼不直接cp1=
cp2;呢),不能去掉"&"的原因如下:
如果沒了引數的"&",那麼這個returnme函式所做的事情就是將cp1複製給臨時物件a,
然後返回a的引用,之後相當於a
=cp2;
再之後過了這一行,a
的生命週期完結了。
而cp1本身自然不受影響。
ps:如果你對「生命週期」或者
返回區域性物件的引用
這些概念不熟悉的話,請參閱
effective
c++(這本薄書看明白了,那baidu
c++區的絕大多數問題都難不住你了)
12樓:堯津過博雅
1 返回變數的引用實際上相當返回變數的位址,通常是四個位元組,如變數多於4個位元組時,返回引用比返回值效率要快.
2 別外,返回引用另乙個用處是外界可以使用這個引用改變原變數的內容,而值返回則不能修改內容.
const引用是要使用1中的效率,而防止2中外界修改這個變數的內容
C語言如何返回字串,C語言中函式如何返回字串?
1 c語言中,字串不是一種基本型別,其本質是字元陣列,因此直接返回字串是不行的。因為c語言不允許例如 char 10 fun 這樣的函式定義方式。但是可以返回字元指標。返回一個動態分配的記憶體地址。2 例如 char c char getinput int length length 為要輸入字串的...
C函式一般返回“1”表示函式成功結束,還是返回“0”表示成功結束
來看看這個可能對你有點啟示 if create 這個東西表示如果建立不成功則.所以create 地返回值為0時表示不成功比較多。但是在c 下面的主函式不是這個定義的。而是返回0表示成功。這個因為這個返回值將會返回給系統告訴系統這個程式是不是正常結束。返回不同值有意義,所以才採用返回0表示成功。 如果...
返回值和函式值的問題,C 函式返回值問題
函式值跟返回值本來就是一回事。乙個函式只能返回乙個值,這個值是通過renturn 語句返回給main 函式的。函式前面的int就是定義的返回值型別。也就是這個被調函式工作完了,要給main函式乙個值,這個值的型別是int,如果你的int換成是float,char 以及其他任意資料型別,那麼retur...