[一道搜狗输入法的面试题]C++转换构造函数和类型转换函数
今天面試遇到一道有關(guān)C++轉(zhuǎn)換構(gòu)造函數(shù)的題目,之前經(jīng)常見到默認(rèn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù),但是從沒聽說過轉(zhuǎn)換構(gòu)造函數(shù),隱式轉(zhuǎn)換函數(shù)也是一樣,C++的確是夠博大精深的,學(xué)習(xí)之路很長啊!
其實(shí)我們已經(jīng)在C/C++中見到過多次標(biāo)準(zhǔn)類型數(shù)據(jù)間的轉(zhuǎn)換方式了,這種形式用于在程序中將一種指定的數(shù)據(jù)轉(zhuǎn)換成另一指定的類型,也即是強(qiáng)制轉(zhuǎn)換,比如:int a = int(1.23)(C++形式)或者int a = (int)1.23(C形式)其作用是將1.23轉(zhuǎn)換為整形1。然而對(duì)于用戶自定義的類類型,編譯系統(tǒng)并不知道如何進(jìn)行轉(zhuǎn)換,所以需要定義專門的函數(shù)來告訴編譯系統(tǒng)改如何轉(zhuǎn)換,這就是轉(zhuǎn)換構(gòu)造函數(shù)和類型轉(zhuǎn)換函數(shù)!
一、轉(zhuǎn)換構(gòu)造函數(shù)
轉(zhuǎn)換構(gòu)造函數(shù)(conversion constructor function) 的作用是將一個(gè)其他類型的數(shù)據(jù)轉(zhuǎn)換成一個(gè)類的對(duì)象。
當(dāng)一個(gè)構(gòu)造函數(shù)只有一個(gè)參數(shù),而且該參數(shù)又不是本類的const引用時(shí),這種構(gòu)造函數(shù)稱為轉(zhuǎn)換構(gòu)造函數(shù)。
轉(zhuǎn)換構(gòu)造函數(shù)是對(duì)構(gòu)造函數(shù)的重載。
例如:
Complex(double r) { real=r; imag=0; }其作用是將double型的參數(shù)r轉(zhuǎn)換成Complex類的對(duì)象,將r作為復(fù)數(shù)的實(shí)部,虛部為0。用戶可以根據(jù)需要定義轉(zhuǎn)換構(gòu)造函數(shù),在函數(shù)體中告訴編譯系統(tǒng)怎樣去進(jìn)行轉(zhuǎn)換。
那么如何利用轉(zhuǎn)換構(gòu)造函數(shù),進(jìn)行自定義類型轉(zhuǎn)換呢?看下面的例子:
#include <iostream> using namespace std; class Complex { public:Complex():real(0),imag(0){cout << "Default ctor..." << endl;}Complex(double r, double i):real(r), imag(i){cout << "Param ctor..." << endl;}Complex(double r):real(r),imag(0){cout << "Convert ctor..." << endl;} Complex(const Complex& c1){cout << "Copy ctor..." << endl;this->real = c1.real;this->imag = c1.imag;}Complex& operator=(const Complex& c1){cout << "Assign ctor..." << endl;this->real = c1.real;this->imag = c1.imag;return *this;}Complex operator+(const Complex& c){return Complex(this->real + c.real, this->imag + c.imag);}void Print(){cout << "real = " << real << " imag = " << imag << endl;}private:double real, imag; }; int main() { Complex c;c = 1.2;c.Print();Complex c1(2.9, 4.2);Complex c2 = c1 + 3.1;c2.Print();return 0; }結(jié)果輸出為:
注:編譯器是不會(huì)自動(dòng)的添加轉(zhuǎn)換構(gòu)造函數(shù)的,因?yàn)樗恢涝趺崔D(zhuǎn)換。
二、類型轉(zhuǎn)換函數(shù)
用轉(zhuǎn)換構(gòu)造函數(shù)可以將一個(gè)指定類型的數(shù)據(jù)轉(zhuǎn)換為類的對(duì)象。但是不能反過來將一個(gè)類的對(duì)象轉(zhuǎn)換為一個(gè)其他類型的數(shù)據(jù)(例如將一個(gè)Complex類對(duì)象轉(zhuǎn)換成double類型數(shù)據(jù))。而類型轉(zhuǎn)換函數(shù)就是專門用來解決這個(gè)問題的!
類型轉(zhuǎn)換函數(shù)的作用是將一個(gè)類的對(duì)象轉(zhuǎn)換成另一類型的數(shù)據(jù)。
如果已聲明了一個(gè)Complex類,可以在Complex類中這樣定義類型轉(zhuǎn)換函數(shù):
類型轉(zhuǎn)換函數(shù)的一般形式為:
operator 類型名( ) {實(shí)現(xiàn)轉(zhuǎn)換的語句 }注意事項(xiàng):
1.在函數(shù)名前面不能指定函數(shù)類型,函數(shù)沒有參數(shù)。
2.其返回值的類型是由函數(shù)名中指定的類型名來確定的。
3.類型轉(zhuǎn)換函數(shù)只能作為成員函數(shù),因?yàn)檗D(zhuǎn)換的主體是本類的對(duì)象,不能作為友元函數(shù)或普通函數(shù)。
4.從函數(shù)形式可以看到,它與運(yùn)算符重載函數(shù)相似,都是用關(guān)鍵字operator開頭,只是被重載的是類型名。double類型經(jīng)過重載后,除了原有的含義外,還獲得新的含義(將一個(gè)Complex類對(duì)象轉(zhuǎn)換為double類型數(shù)據(jù),并指定了轉(zhuǎn)換方法)。這樣,編譯系統(tǒng)不僅能識(shí)別原有的double型數(shù)據(jù),而且還會(huì)把Complex類對(duì)象作為double型數(shù)據(jù)處理。
看下面的代碼:
#include <iostream> using namespace std; class Complex { public:Complex():real(0),imag(0){cout << "Default ctor..." << endl;}Complex(double r, double i):real(r), imag(i){cout << "Param ctor..." << endl;}//轉(zhuǎn)換構(gòu)造函數(shù)Complex(double r):real(r),imag(0){cout << "Convert ctor..." << endl;} //重載+運(yùn)算符Complex operator+(const Complex& c){return Complex(this->real + c.real, this->imag + c.imag);}//類型轉(zhuǎn)換函數(shù)operator double(){return real;}private:double real, imag; }; int main() { Complex c1(1.2, 2.3); double d; d = c1 + 1.1; // 調(diào)用類型轉(zhuǎn)換函數(shù)將c1轉(zhuǎn)換為double cout<<d<<endl; return 0; }代碼是不能通過編譯的:
error C2666: '+' : 2 overloads have similar conversions也就是說我們?cè)谶@里定義了轉(zhuǎn)換構(gòu)造函數(shù)和轉(zhuǎn)換函數(shù),編譯器不知道c1+1.1應(yīng)該調(diào)用哪一個(gè)。到底是把c1轉(zhuǎn)換成double,還是把1.1轉(zhuǎn)換成對(duì)象,產(chǎn)生二義性。
這里的解決辦法就是,把轉(zhuǎn)換構(gòu)造函數(shù)去掉。但是如果把類型轉(zhuǎn)換函數(shù)去掉,那么最后在把對(duì)象轉(zhuǎn)換成double的時(shí)候還是通不過編譯。
總結(jié):轉(zhuǎn)換構(gòu)造函數(shù)和類型轉(zhuǎn)換函數(shù)就是在做自定義的類型同其它數(shù)據(jù)類型直接的方便的轉(zhuǎn)換。(通過賦值符號(hào)=直接轉(zhuǎn)換)
?
轉(zhuǎn)載于:https://www.cnblogs.com/stemon/p/4836611.html
總結(jié)
以上是生活随笔為你收集整理的[一道搜狗输入法的面试题]C++转换构造函数和类型转换函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历史最牛 多页切换TabHost,给大家
- 下一篇: C++中public、protected