初始化變數與函式生命週期的關係及析構函式的執行時機

2021-10-03 03:49:36 字數 1043 閱讀 3056

想實現輸入兩個值,經過乙個函式什麼都不改變,然後,輸出出來,但發現,中間竟然把原來輸入進去的值給改變了!讓我一頓好找。。。。。。。

錯誤**:

#include using namespace std;

class location

~location()

int getx()

int gety()

private: int x, y;

};void main()

執行如下: 

然後,就百思不得其解,後來,再折騰了很多時間後,總算發現問題了,在定義建構函式的時候:

location(int xx = 0, int yy = 0)

會發現:"int x = xx;",這句話,就決定了悲劇的發生,對於編譯器而言,這句話分成下面幾步執行:第一步,建立乙個型別為int型別的變數;第二步,將xx的值賦給x。那麼本來這是平淡無奇的,關鍵就關鍵在,這個語句定義在了建構函式內部,當在建構函式內部時,x,y被定義出來了,並且賦值成功,當建構函式執行完畢之後,x,y所佔據的記憶體空間也將被析構,所以,再通過外部去訪問x,y的時候,就會出現裡面是亂碼了!

該怎麼改呢?簡單到不能再簡單了,只要把int變數符號去掉就行了:

location(int xx = 0, int yy = 0)

執行結果如下:

這樣就好了!

當我執行這段程式的時候,發現析構函式是在我按下任意鍵之後,才執行的,經過查詢得到這樣乙個結論:只有當類的某個例項化物件的建構函式執行完畢,而且當該物件退出作用域時,才會執行析構函式。而本段程式對應的作用域是std,那麼就是當退出主調函式的時候,才會執行。

vue中的生命週期(一) 初始化

vue的生命週期分為三個階段,分別為 初始化,執行中,銷毀,一共8個鉤子函式 注意 生命週期鉤子函式不允許寫成箭頭函式 vue中的生命週期指的是 元件 從建立到銷毀的乙個過程,在這個過程中,我們在每乙個特定的階段會觸發一些方法 這些方法具備一些功能 我們給這些方法起了個名字叫做 生命週期鉤子函式 元...

變數的生命週期

from 今天在論壇上看到有朋友發帖問道 既然靜態全域性變數與全域性變數都儲存在全域性資料區,為什麼作用域卻不一樣呢?也許答案非常簡單 c 就是這麼規定的,靜態全域性變數與全域性變數的唯一區別就是作用域不同。對乙個c 變數來說,有兩個屬性非常重要 作用域和生命週期,它們從兩個不同的維度描述了乙個變數...

變數的生命週期

1 全域性變數 作用域 全域性作用域 只需要在乙個原始檔中定義,就可以作用於所有的原始檔 生命週期 程式執行期一直存在 記憶體分布 全域性 靜態儲存區 注意 如果再兩個檔案中都定義了相同名字的全域性變數,則連線錯誤 變數重定義。2 全域性靜態變數 生命週期 程式執行期一直存在 作用域 檔案作用域 只...