1. 程式人生 > >物件(深入C++物件模型)

物件(深入C++物件模型)

Matrix identity //Matrix 是一個類

main()
{
 //identity必須放在此處初始化
 Matrix m1= identify;
 ...
 return 0;
}

C++ 保證,一定會在main函式中第一次用到identity之前,把identity構造出來,而在main函式結束之前把identity結束掉,像identity這樣所謂的全域性物件,如果有建構函式和解構函式,它需要靜態的初始化操作和記憶體釋放操作。
C++程式中所有的資料部分都被放置在程式的資料部分中,如果顯式指定給一個值,此物件將以該值為初值,否則object所配置的內容都為0。

int v1 = 1024
; 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物件中求表示式結果,避免拷貝構造和具體物件的析構