物件(深入C++物件模型)
阿新 • • 發佈:2019-02-04
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物件中求表示式結果,避免拷貝構造和具體物件的析構