C 中的顯式建構函式

2022-05-10 15:02:31 字數 1577 閱讀 7323

class

clxcomplex

double getreal() const

double getimage() const

private

:

double

m_dreal;

double

m_dimage;

};

我們知道,下面的3行**是等價的:

clxcomplex lxtest = 2.0

;clxcomplex lxtest = clxcomplex(2.0

);clxcomplex lxtest = clxcomplex(2.0, 0.0);

其實,對於前兩行來說,編譯器都是把它們轉換成第3行的**來實現的。因為我們寫了建構函式,編譯器就按照我們的建構函式來進行隱式轉換,直接把乙個double數值隱式轉換成了乙個clxcomplex的物件。可是,有些時候,我們不希望進行隱式轉換,或者隱式轉換會造成錯誤。比如下面的乙個簡化的字串類:

class

clxstring

;clxstring::clxstring(

intilength)

clxstring::clxstring(

const

char *pstring)

clxstring::~clxstring()

我們可以用字串的長度來初始化乙個clxstring的物件,但是我們卻不希望看到下面的**:

clxstring lxtest = 13;  //

等同於clxstring lxtest = clxstring(13);

這會給閱讀**造成不必要的歧義。

還有,我們知道下面的**是用字串a來初始化乙個clxstring的物件:

clxstring lxtest = "

a"; //

等同於clxstring lxtest = clxstring("a");

可是,如果有人寫成:

clxstring lxtest = '

a'; //

等同於clxstring lxtest = clxstring(65);

那上面的**就會初始化乙個長度為65(字母a的ascii碼值,在c和c++中,字元是以ascii值儲存的)的字串。

當然,上面的情況都不是我們希望看到的。在這個時候我們就要用到顯示建構函式了。

將建構函式宣告成explicit就可以防止隱式轉換。

下面是使用顯示建構函式的clxstring:

class

clxstring

;

在這種情況下,要想用字串的長度來初始化乙個clxstring物件,那就必須顯示的呼叫建構函式:

clxstring lxtest = clxstring(13);

而下面這些**將不能通過編譯。

clxstring lxtest = 13

; clxstring lxtest = '

a';

C 中的顯式建構函式

以兩個c 的小例子來說明怎樣通過使用顯式建構函式來防止隱式轉換。class clxcomplex double getreal const double getimage const private double m dreal double m dimage 我們知道,下面的3行 是等價的 clx...

C 中的顯式建構函式

c 中的顯式建構函式 以兩個c 的小例子來說明怎樣通過使用顯式建構函式來防止隱式轉換。class clxcomplex double getreal const double getimage const private double m dreal double m dimage 我們知道,下面的...

C 中的顯式建構函式

class clxcomplex double getreal const double getimage const private double m dreal double m dimage 我們知道,下面的3行 是等價的 clxcomplexlxtest 2.0 clxcomplexlxte...