C 物件的構造

2021-08-18 18:33:51 字數 1077 閱讀 3650

物件是依據某個類模板建立的客觀存在,既然是客觀存在那麼它在某一時刻的狀態應該是確定,所以我們在建立物件的時候需要固定其狀態,也就是初始化,這就是建構函式的作用,初始化物件。

class test

test(int i){}

}

物件的構造一般有3  種方式:

test t(2);

test t = 2;

test t = test(2);

需要注意的是,

test t = 2;

test t;

t = 2;

這兩種情況的 = 符號是有本質區別的,第一種代表的是初始化,會呼叫test(int i)建構函式,而第二種就是簡單的賦值操作。

乙個類中建構函式時必然存在的,因為物件的建立需要建構函式。所以當我們編寫類的時候,如果沒有寫建構函式,編譯器會預設的給我們新增:

1. 當類中不存在建構函式時,會預設新增乙個預設的無參建構函式

2. 當類中不存在拷貝建構函式時,會預設新增乙個拷貝建構函式

拷貝建構函式簡單的說就是,拷貝建構函式也屬於一種建構函式,引數是const class_name&  的建構函式。對於上面的例子就是:

test& test(const test& e);
拷貝建構函式在物件之間使用賦值操作符時呼叫。

淺拷貝:使兩個物件的物理狀態相同

深拷貝:使兩個物件邏輯狀態相同

淺拷貝直觀來看,就是使物件的各個屬性值相等。但是考慮到物件的某個屬性是可能是乙個指標,如果直接把指標的值賦值的話,會導致兩個物件的這個屬性指向同一片空間,這在某些情況下是不符合邏輯的。這時就需要深拷貝,從先申請一片記憶體,把指標指向的記憶體的值拷貝過來。

注意,預設的拷貝建構函式時淺拷貝。

1.   呼叫父類的建構函式

2.  呼叫成員變數的建構函式

3.  呼叫自身建構函式

顯然析構函式的呼叫順序應與建構函式相反,編譯器會在析構函式預設新增對父類析構函式的呼叫,顯然如果父類析構函式是純需函式的話,會導致編譯不通過,鏈結時提示找不到對應的函式。

C 物件的構造順序

在c 中物件的構造順序有三種 1 區域性構造物件順序 2 堆物件構造順序 3 全域性物件構造順序 1 區域性構造物件順序構造物件例子 當程式執行流到達物件的定義語句時進行構造 include class test test const test obj int main if i 4 else re...

C 物件的構造 下

在c 中,如果我們定義乙個類,沒有定義任何的建構函式,那麼編譯器會為我們提供兩個特殊的建構函式 無參建構函式和拷貝建構函式 無參建構函式 其實就是乙個沒有引數 函式體為空的建構函式 拷貝建構函式 函式引數為 const class name 拷貝建構函式只是簡單的進行成員變數的賦值 下邊來看下邊兩個...

C 物件構造順序

程式裡不可能只有乙個物件,我們的程式裡處處都是物件,那麼物件的構造順序是怎麼樣的呢。還是按照在記憶體四區上的分布來分開說,此處不在說 段。如果物件是在棧上分配的,那麼肯定是在函式中建立的,只要main函式開始執行,就有了程式執行流,所以分配在棧上的物件的構造順序是按照順序執行流和物件的定義語句來確定...