Matrix identity //Matrix 是一個類
main()
{
//identity必須放在此處初始化
Matrix m1= identify;
...
return ;
}
C++ 保證,一定會在main函數中第一次用到identity之前,把identity構造出來,而在main函數結束之前把identity結束掉,像identity這樣所謂的全局對象,如果有構造函數和析構函數,它需要靜态的初始化操作和記憶體釋放操作。
C++程式中所有的資料部分都被放置在程式的資料部分中,如果顯式指定給一個值,此對象将以該值為初值,否則object所配置的内容都為0。
int v1 = ;
int v2;
v1和v2都配置于程式的資料區,v1值為1024,v2值為0(這和C有不同,C并不自動設定初值)。
局部靜态對象
const Matrix& identify()
{
static Matrix mat_identify;
//...
return mat_identify;
}
- mat_identify的構造必須隻能運作一次,雖然上述函數可能會被調用多次
- mat_identity的析構必須隻能運作一次,雖然上述函數可能會被調用多次
new 和 delete
new 運算符實際上總是以标準的C
malloc()
完成,雖然并沒有規定一定得這麼做不可,相同情況,delete運算符也是以标準的C
free()
完成的。
臨時性對象
如果我們有一個函數
T operator+ (const T &,const T &)
以及兩個對象,a和b,那麼:
a+b;
可能會導緻一個臨時性對象,以放置傳回的對象。是否導緻一個臨時性對象,視編譯器的進取性以及上述操作發生時的程式語境而定。
T a,b;
T c = a+b;
編譯器會産生一個臨時性對象,放置
a+b
的結果,然後再利用T的拷貝構造函數,把該臨時性對象當做c的初始值。然而比較更可能的轉換就是直接以拷貝構造的方式,将
a+b
的值放在c中,于是不需要臨時性對象,以及對其構造和析構的調用。此外,視
operator+()的定義而定,named return value (NRV)
優化,這将導緻直接在上述c對象中求表達式結果,避免拷貝構造和具體對象的析構