天天看點

對象(深入C++對象模型)局部靜态對象new 和 delete臨時性對象

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對象中求表達式結果,避免拷貝構造和具體對象的析構

繼續閱讀