C 函式返回類物件時是否執行析構函式

2021-10-10 15:04:05 字數 687 閱讀 3298

#includeusing namespace std;

struct a

a(const a&)

~a()

};a f()

a g()

int main()

vs2019結果:

f

copy constructor

destructor

gdestructor

destructor

mingw64(g++ v8.3.0; 10.1.0)結果:

f

gdestructor

destructor

可以看到,在vs下,函式返回類物件時,如果是在return語句後面構造的,則不執行拷貝建構函式,直接賦值給承接返回值的變數,就像承接返回值的變數和返回值是乙個例項一樣;如果是在函式體內部構造,則就像以下**一樣執行:

a returnvalue;

a var(returnvalue);//拷貝建構函式

//銷毀returnvalue

而在g++下,都是按照第一種情況處理的。

今天才發現,這坑踩過多少次了

°(°ˊдˋ°) °

C 函式返回值為物件時,構造析構函式的執行細節

看如下 複製 如下 include class testconstructor testconstructor testconstructor const testconstructor testobj testconstructor operator const testconsqulkrjmst...

《類和物件》 析構函式

概念 前面通過建構函式的學習,我們知道乙個物件時怎麼來的,那乙個物件又是怎麼沒呢的?析構函式 與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的。而 物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作。特性 析構函式是特殊的成員函式。其特徵如下 析構函式名是在類...

C 類析構函式

析構函式是c 釋放類物件的函式,如果在類中不寫析構函式,c 編譯器會自動補上析構函式。如果人為定義了析構函式,那麼會呼叫人為定義的。預設析構函式不會釋放成員指標變數所指向的記憶體空間,如果要釋放的話,還需要人為定義釋放。析構函式在物件釋放的時候自動呼叫,在delete 刪除物件的時候,也會呼叫析構函...