class
clxcomplex
double
getreal()
const
double
getimage()
const
private
:double
m_dreal;
double
m_dimage;};
我們知道,下面的3行**是等價的:
clxcomplexlxtest
=2.0
;clxcomplexlxtest
=clxcomplex(
2.0);
clxcomplexlxtest
=clxcomplex(
2.0,
0.0);
其實,對於前兩行來說,編譯器都是把它們轉換成第3行的**來實現的。因為我們寫了建構函式,編譯器就按照我們的建構函式來進行隱式轉換,直接把乙個 double數值隱式轉換成了乙個clxcomplex的物件。可是,有些時候,我們不希望進行隱式轉換,或者隱式轉換會造成錯誤。比如下面的乙個簡化的 字串類:
class
clxstring
;clxstring::clxstring(
intilength)
clxstring::clxstring(
const
char
*pstring)
clxstring::
~clxstring()
我們可以用字串的長度來初始化乙個clxstring的物件,但是我們卻不希望看到下面的**:
clxstringlxtest=13
;//等同於clxstringlxtest=clxstring(13);
clxstringlxtest="
a";//
等同於clxstringlxtest=clxstring("a");
可是,如果有人寫成:
clxstringlxtest='
a';//
等同於clxstringlxtest=clxstring(65);
那上面的**就會初始化乙個長度為65(字母a的ascii碼值,在c和c++中,字元是以ascii值儲存的)的字串。
當然,上面的情況都不是我們希望看到的。在這個時候我們就要用到顯示建構函式了。
將建構函式宣告成explicit就可以防止隱式轉換。
下面是使用顯示建構函式的clxstring:
class
clxstring;
在這種情況下,要想用字串的長度來初始化乙個clxstring物件,那就必須顯示的呼叫建構函式:
clxstringlxtest
=clxstring(
13);
而下面這些**將不能通過編譯。
clxstringlxtest=13
;clxstringlxtest='
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行 是等價的 clxcomplex lxtest 2.0 clxcomplex lx...