C 返回類時,返回引用還是構造乙個新的例項,什麼時候返回const?

時間 2021-05-30 14:40:46

1樓:Sunchy321

1 把print的形參改成A const&。

我不能理解為什麼要改成右值引用,如果有人能向我解釋清楚我非常感謝。

A&能接受A const大概說明了什麼。

2 我認為,是否返回引用其實取決於返回值是不是乙個新的物件。

當然,operator++有其準則,也就是模仿內建運算子的行為(當然,不可能完全等同)。前置++結果是左值,後置++結果是右值,所以過載的前者返回左值non-const引用,而後者不。後者返不返回右值引用我不敢確定,不過似乎沒啥卵用。

引用有沒有const取決於情況。

3 關於返回的prvalue是不是應該const的問題,Scott Meyers在《Effective C++》中認為應該這麼做。我並不清楚他是否仍如此認為,但這麼做似乎會造成一些困擾(比如,除了類型別和陣列型別,其它型別的prvalue其實都沒有const限定)。另外,是不是const和是不是右值沒有一毛錢的關係,雖然它們的行為確實有所重疊:

這是C++自己的設計問題。

2樓:劉家楨

我在VS2012下編譯,出現的編譯錯誤和題主描述不同。

當getOne函式返回值型別是A時,可以編譯通過;

當getOne返回值型別是const A時,將其作為print_A的引數,編譯錯誤,error C2664: 「print_A」:不能將引數 1 從「const A」轉換為「A &」

這個錯誤應該是,非常量引用不能引用常量。

3樓:藍色

問題1:

你的引數列表是需要乙個左值引用,但是你傳遞給它的是乙個臨時的右值,自然會出錯,所以你把

void printA(A& a)變為void printA(A&& a)即可。

問題2/3:

加與不加const是需要看具體完成的功能,如const加在成員函式末尾代表著不更改成員函式的值等,所以這沒有乙個標準的答案,依具體場景而定。

4樓:Xi Yang

返回的時候被拷貝一次。當然,編譯器有時能夠優化掉這個拷貝。

按新的C++11標準,通常會變成「移動」一次。

C++玩工廠模式,通常應當分配乙個堆上物件,然後構建函式返回物件的指標。

另外:你的print_A並不需要修改A的內容,引數加上const。

getOne可以返回乙個const引用,引用指向乙個靜態的類成員。這樣不需要反覆地建立新物件。

為什麼c 裡返回引用是危險的,但msdn還是寫了這樣的用法?

小島上的做題家 你的程式UML畫下來應該是一棵樹或者幾棵樹。構建時是從下往上構建,釋放時從上往下釋放。乙個object儲存的reference,其值一定要在這個架構中比這個object靠下,才是安全的,因為它的life time比你這個object長。本質上,你只要定義明白這個ref比它的使用者活得...

乙個全域性函式 內部返回乙個類的靜態物件的引用 也是可以達到類似單例的效果 怎麼解釋

Jon Lee 注意 Meyer s singleton 在多執行緒時,C 03 下不是thread safe的。從C 11 起變成thread safe了 也有稱之為magic statics 的 Jeson Chen 為什麼會有這種效果和出處已經有人說了,就是靜態物件的生存週期問題。原因書上有說...

如果乙個函式的錯誤返回值被包含在正確返回值之中,怎麼處理?

Menooker 用Optional scala裡可以用option,c 新標準裡有optional,都是用來裝乙個值,要麼有值,要麼就是None 直接不可以。因為,如,int i 對16位機,實際是int16 t i的允許取值範圍是 32768 32767,如果想同時再返回乙個狀態量,用於表示是否...