java显式构造函数_C++中的显式构造函数
有如下一個簡單的復數類:
classClxComplex
{public:
ClxComplex(doubledReal=0.0,doubledImage=0.0){m_dReal=dReal;dImage=dImage;}doubleGetReal()const{returnm_dReal;}doubleGetImage()const{returnm_dImage;}private:doublem_dReal;doublem_dImage;
};
我們知道,下面的3行代碼是等價的:
ClxComplexlxTest=2.0;
ClxComplexlxTest=ClxComplex(2.0);
ClxComplexlxTest=ClxComplex(2.0,0.0);
其實,對于前兩行來說,編譯器都是把它們轉換成第3行的代碼來實現的。因為我們寫了構造函數,編譯器就按照我們的構造函數來進行隱式轉換,直接把一個 double數值隱式轉換成了一個ClxComplex的對象??墒?#xff0c;有些時候,我們不希望進行隱式轉換,或者隱式轉換會造成錯誤。比如下面的一個簡化的 字符串類:
classClxString
{public:
ClxString(intiLength);
ClxString(constchar*pString);~ClxString();private:char*m_pString;
};
ClxString::ClxString(intiLength)
{if(iLength>0)
m_pString=newchar[iLength];
}
ClxString::ClxString(constchar*pString)
{
m_pString=newchar[strlen(pString)];
strcpy(m_pString,pString);
}
ClxString::~ClxString()
{if(m_pString!=NULL)
deletem_pString;
}
我們可以用字符串的長度來初始化一個ClxString的對象,但是我們卻不希望看到下面的代碼:
ClxStringlxTest=13;//等同于ClxStringlxTest=ClxString(13);
這會給閱讀代碼造成不必要的歧義。
還有,我們知道下面的代碼是用字符串A來初始化一個ClxString的對象:
ClxStringlxTest="A";//等同于ClxStringlxTest=ClxString("A");
可是,如果有人寫成:
ClxStringlxTest='A';//等同于ClxStringlxTest=ClxString(65);
那上面的代碼就會初始化一個長度為65(字母A的ASCII碼值,在C和C++中,字符是以ASCII值存儲的)的字符串。
當然,上面的情況都不是我們希望看到的。在這個時候我們就要用到顯示構造函數了。
將構造函數聲明成explicit就可以防止隱式轉換。
下面是使用顯示構造函數的ClxString:
classClxString
{public:explicitClxString(intiLength);
ClxString(constchar*pString);~ClxString();private:char*m_pString;
};
在這種情況下,要想用字符串的長度來初始化一個ClxString對象,那就必須顯示的調用構造函數:
ClxStringlxTest=ClxString(13);
而下面這些代碼將不能通過編譯。
ClxStringlxTest=13;
ClxStringlxTest='A';
分享到:
2007-09-11 20:38
瀏覽 476
評論
總結
以上是生活随笔為你收集整理的java显式构造函数_C++中的显式构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 期货交易_Python期货
- 下一篇: java 克隆的作用_关于java中克隆