有關臨時物件的生命週期有三種情況:
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 就是物件誕生後第乙個執行 並且是自動執行 的函式,它 的函式名稱必定要與類別名稱相同。相對於構造式,自然就...