C 臨時物件的生命週期

2021-04-13 08:22:35 字數 1584 閱讀 3046

有關臨時物件的生命週期有三種情況:

1)一般情況:臨時性物件的被摧毀,應該是對完整表示式(full-expression)求值過程中的最後乙個步驟。該完整表示式造成臨時物件的產生。

例:#include

using namespace std;

class a

~a()

a operator+(const a& rhs)

int m_i;

};int main()

執行結果:

a(): 1

a(): 2

a operator+(const a& rhs)

a(): 3

~a(): 3

------------------------------------

~a(): 2

~a(): 1

兩個例外:

2)凡含有表示式執行結果的臨時性物件,應該存留到object的初始化操作完成為止。

例:#include

using namespace std;

class a

~a()

a operator+(const a& rhs)

a& operator=(const a& rhs)

int m_i;

};int main()

執行結果:

a(): 1

a(): 2

a(): 0

a operator+(const a& rhs)

a(): 3

a& operator=(const a& rhs)

~a(): 3

~a(): 3

~a(): 2

~a(): 1

3)如果乙個臨時性物件被繫結於乙個reference,物件將殘留,直到被初始化之reference的生命結束,或直到臨時物件的生命範疇(scope)結束——視哪一種情況先到達而定。

例:#include

using namespace std;

class a

~a()

};ostream& operator<<(ostream& os, const a&)

const a& f(const a& a)

int main(int argc, char* argv)

//直到被初始化之reference的生命結束

cout  << f(a()) << endl; //直到臨時物件的生命範疇(scope)結束:

//臨時物件的const引用在f的引數上(而不是返回值)。

//這個引用在f()返回的時候就結束了,但是臨時物件未必銷毀。

cout << "-------------------" << endl;

return 0;

}執行結果:

-------------------

~a()

ostream& operator<<(ostream& os, const a&)

~a()

-------------------

參考:《深度探索c++物件模型》6.3節 p270-p275

《c++標準(2003)》12.2節 

C 臨時變數的生命週期

c 中的臨時變數指的是那些由編譯器根據需要在棧上產生的,沒有名字的變數。主要的用途主要有兩類 string proc int main 其中第 6 行會產生乙個臨時變數。但並不是所有返回值都會建立臨時變數,只有當沒有將返回值賦值給其它變數時,臨時變數才會建立。這種臨時變數的生命週期很短,當表示式完成...

C 臨時變數的生命週期

c 中的臨時變數指的是那些由編譯器根據需要在棧上產生的,沒有名字的變數。主要的用途主要有兩類 1 函式的返回值,如 1 string proc 25 6int main 7其中第 8 行會產生乙個臨時變數。但並不是所有返回值都會建立臨時變數,只有當沒有將返回值賦值給其它變數時,臨時變數才會建立。這種...

c 物件的生命週期

c 的new 運運算元和c 的malloc 函式都是為了配置記憶體,但前者比之後者的優點 是,new 不但配置物件所需的記憶體空間時,同時會引發構造式的執行。所謂構造式 constructor 就是物件誕生後第乙個執行 並且是自動執行 的函式,它 的函式名稱必定要與類別名稱相同。相對於構造式,自然就...