如何理解c 中這個等號?

時間 2021-06-08 06:09:33

1樓:

這個等號你就可以理解成copy constructor,原因很簡單,上面朋友已經說了,copy elision。

這完全是編譯器行為,不同編譯器和優化級別會有不同的結果。例如,像clang這種優化比較暴力的編譯器,往往會利用RVO機制把所有產生返回值複製的開銷都給你乾掉,最後只呼叫乙個預設建構函式。如果你用MSVC的話,開O3級別的優化也會有類似效果。

2樓:風吟

首先希望題主弄清楚拷貝構造和拷貝賦值的區別,Sample S=Fun(),這是拷貝構造。好現在來分析下,首先宣告乙個區域性變數 S 會呼叫乙個default copy函式,當它離開自己的作用域時,會呼叫一次它的析構函式。Sample S=Fun(),「=」是拷貝構造,呼叫一次拷貝建構函式,主函式執行完後,再一次呼叫它的析構函式。

所以析構函式呼叫了二次,default copy 函式和copy建構函式個呼叫一次。

3樓:馬可

這裡的「=」,不是代表「賦值」的意思,而是代表「構造」的意思;在建立S2變數的時候,有乙個臨時變數作為引數(由fun()產生),因此不會呼叫「預設的建構函式」(不帶引數值)以及「賦值函式」,而是呼叫「拷貝建構函式」。

至於何時呼叫「賦值函式」,這裡有個簡便的判別方法(也許並不嚴謹),就是,如果物件之前沒有構造出來,那麼就要先構造;如果物件已經構造出來了,那麼如果有=,就應該呼叫賦值函式。

4樓:someone

在windows vs2017 下 debug和release 輸出不一樣, 但都會呼叫建構函式啊。

題主用啥編譯器的,不呼叫建構函式?

如何理解 C 中 int i 的宣告方式?

我的偏好,當定義指標型別物件的時候,比如你的例子,我寫成int a,理由,為了統一,好記,int 是型別名,a是變數名.指標是復合型別,不同型別復合出的指標型別型別不同。 Shark 個人偏好把int 看做乙個整體,把i作為變數,實際上這也符合從右向左看的原則。至於int i的寫法,我認為可以理解為...

如何理解C 中的「全排列問題」?

如果是求全排列,直接dfs回溯就行了。如果是std next permutation,思路就是把公升序佇列逐步轉為降序佇列。比如1234最後要轉化為4321,過程是 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 31...

c 中如何對這個json資料進行篩選?

肖進 是要找B等於true的上層節點名稱嗎,試試fastCSharp,JSON 資料序列化 C 高效能自動化服務端框架 凹凸架構 Console WriteLine new fastCSharp setup cSharp json parser Parse json Dictionary first...