C 隱式構造與顯式構造

2021-09-01 02:41:20 字數 1709 閱讀 5026

《一》

class stock

;

c++提供了兩種使用建構函式來初始化物件的方法。第一種是顯式的呼叫建構函式:

stock food = stock("hello",12,20.5);
這將food物件的_company成員設定為字串"hello",將_share成員設定為12,以此類推。

另一種是隱式地呼叫建構函式:

stock garment("world",13,2.5);
這種呼叫更緊湊,它與下面的顯示呼叫等價:

stock garment = stock("world",13,2.5);
每次建立類物件(甚至使用new動態分配記憶體)時,c++都使用類建構函式。下面是將建構函式與new一起使用的方法:

stock *pstock =  new stock("google",15,22.5);
這條語句建立了乙個stock物件,將其初始化為引數提供的值,並將該物件的位址賦給pstock指標。在這種情況下,物件沒有名稱,但是可以使用指標來管理該物件。

建構函式的使用不同於其他類方法。一般來說,使用物件來呼叫方法:

stock1.show();
但無法使用物件來呼叫建構函式,因為在建構函式構造出物件之前,物件是不存在的。因此建構函式被用來建立物件,而不能同過物件來呼叫。

《二》

class a

;

如果在編寫類時沒有顯示的寫出其建構函式,拷貝建構函式,析構函式,以及過載賦值操作符,編譯器會在編譯**時,會為該類加上這些。

其形式大致如下:

class a

a& operator =(const a& a)

a(const a& a)

~a() // 注意在析構函式前不會加上virtual關鍵字

};

下面給出一些示例,注釋部分說明了函式呼叫的情況:

void f()

// 離開f()函式之前,a,b,c的析構函式被呼叫,釋放資源

a c = a;
這句**實際呼叫的是拷貝建構函式,而非賦值函式。

因此,我們可以構造出這樣的**。

class a

a(int n)

a& operator =(const a& a)

virtual ~a()

}};

int main()

將整數3賦值給乙個a型別物件a,然而以上**可以編譯通過。 -- 有點不合常理

這是由於「單引數建構函式」被自動型別轉換(這是乙個隱式轉換)。

可以通過explicit關鍵字,阻止「以賦值語法進行帶有轉型操作的初始化」。如下所示:

class a

explicit a(int n)

a& operator =(const a& a)

virtual ~a()

}};

int main()

C 顯式建構函式

如果c 類的其中乙個建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件。如下面的例子 include using namespace std class b explicit b int data data data int main 在程式的...

C 顯式建構函式 翻譯

簡介 建構函式的確能使你的類變的簡單優雅,它也是乙個基本的函式,可以由編譯器以預設的方式提供給你,即預設建構函式。在c 中,如果你只寫一行 class a 編譯器會提供給你乙個預設的 無引數的建構函式,並伴隨乙個析構函式,乙個拷貝建構函式 copy constructor 乙個拷貝複製操作符 cop...

mysql顯式和隱式效率 顯式與隱式SQL連線

顯式和隱式內部聯接是否存在效率差異?例如 select from table a inner join table b on a.id b.id 與select a.b.from table a,table b where a.id b.id 在mysql 5.1.51上,兩個查詢的執行計畫相同 m...