=====================構(gòu)造函數(shù)的賦值特例=====================
一般地,我們可以利用構(gòu)造函數(shù)對(duì)成員變量進(jìn)行賦值,比如說下例:
class Demo{public: Demo (int a,int b){x=a;y=b;}private: int x; int y;}
那么我們?cè)谡{(diào)用該構(gòu)造函數(shù)的時(shí)候,就可以直接把參數(shù)傳進(jìn)去:
Demo *demo=new Demo(1,2);
但是,有兩個(gè)特例,需要我們注意一下:
由于const成員或者是引用成員都是不可賦值的,所以我們?cè)诶脴?gòu)造函數(shù)操作這些成員的時(shí)候,不能進(jìn)行賦值,只能進(jìn)行初始化!如下例:
class Demo{public: Demo (int a,int b):x(a),y(b){}private: const int x; int &y;}
上面這個(gè)類的第三行就是用構(gòu)造函數(shù)如何初始化(注意,是初始化?。〔皇琴x值?。。┻@兩種特殊的成員函數(shù)的例子。
=====================類型轉(zhuǎn)換問題(explicit)=====================
在C++中,我們可以把一個(gè)參數(shù)當(dāng)做對(duì)象賦給另外一個(gè)對(duì)象。但是這種情況僅限于該對(duì)象的構(gòu)造函數(shù)中僅僅有一個(gè)參數(shù)時(shí)才有用。這種情況出現(xiàn)的時(shí)候,編譯器要做的工作如下:
現(xiàn)在,我們來看看編譯器從第3步到最后一步到底都干了什么......
首先我們定義一個(gè)類demo及其帶有一個(gè)參數(shù)的構(gòu)造函數(shù)demo:
class demo{public: demo(int x){i=x};private: int i;};
如果我們?cè)谙旅娉绦虻诙兄袑懥诉@樣一句話:
demo de(0);//聲明一個(gè)對(duì)象dede=10;//調(diào)用構(gòu)造函數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換
那么,編譯器會(huì)重新編輯上例中的“de=10”這行代碼:
demo temp(10);//實(shí)例化一個(gè)臨時(shí)對(duì)象de=temp;//用“=”把temp對(duì)象賦值到de對(duì)象中temp.demo::~demo();//調(diào)用temp對(duì)象的析構(gòu)函數(shù),刪除這個(gè)臨時(shí)對(duì)象
這樣一來,我們就可以把10強(qiáng)行賦值給de對(duì)象了。下面,我們來看一個(gè)實(shí)際點(diǎn)的例子:
#include <iostream>using namespace std;class A {public: A(int x){i=x;cout<<"構(gòu)造函數(shù)執(zhí)行!"<<endl;} ~A(){cout<<"析構(gòu)函數(shù)執(zhí)行!"<<endl;} void get(){cout<<i<<endl;}private: int i;};int main(){ A a(99); a.get(); a=1000; a.get(); cout<<endl; a=A(2); a.get(); return 0;}
該程序的輸出為:
我們可以看到輸出窗口里面綠色的那一欄,即程序的第14行,聲明了一個(gè)對(duì)象啊,并調(diào)用構(gòu)造函數(shù),所以輸出“構(gòu)造函數(shù)執(zhí)行”。之后在程序的第17行我們強(qiáng)制把1000賦給對(duì)象a,那么編譯器就可以自動(dòng)調(diào)用臨時(shí)對(duì)象來把這個(gè)值賦給對(duì)象a,同時(shí)賦值完成之后再刪除這個(gè)對(duì)象,所以可以看到“構(gòu)造函數(shù)執(zhí)行”+“析構(gòu)函數(shù)執(zhí)行”(上圖紅色框),這兩句話是因?yàn)榕R時(shí)對(duì)象的創(chuàng)建和銷毀所致地。后面的同樣輸出了這兩句話得原因是因?yàn)榱顺绦虻?0行的作用,強(qiáng)行賦值到a,所以輸出了如上圖藍(lán)色框中的提示。最后,在程序結(jié)束的時(shí)候,調(diào)用析構(gòu)函數(shù)銷毀了對(duì)象a。
像上面這樣做的好處就是可以快速地對(duì)一個(gè)對(duì)象進(jìn)行賦值,但是值得注意的是,這樣的轉(zhuǎn)換又是可能會(huì)導(dǎo)致一些意外。因此我們需要使用關(guān)鍵字explicit來關(guān)閉這種特性,explicit可以用在構(gòu)造函數(shù)中:
explicit A(int x){};
如果聲明了這個(gè)關(guān)鍵字,上面這個(gè)程序就無法執(zhí)行了,程序會(huì)在第17行報(bào)出輸出錯(cuò)誤:
“二進(jìn)制“=”: 沒有找到接受“int”類型的右操作數(shù)的運(yùn)算符(或沒有可接受的轉(zhuǎn)換)”
好了,收工,哈哈
聯(lián)系客服