免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
構(gòu)造函數(shù)的賦值特例與類型轉(zhuǎn)換問題(explicit)

=====================構(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è)特例,需要我們注意一下:

  1. 構(gòu)造帶有const的成員變量
  2. 構(gòu)造帶有引用的成員變量

由于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í)候,編譯器要做的工作如下:

  1. 對(duì)參數(shù)進(jìn)行類型轉(zhuǎn)換
  2. 判斷該類的構(gòu)造函數(shù)的參數(shù)是否與該參數(shù)匹配,假如匹配:
  3. 調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)臨時(shí)的對(duì)象
  4. 將該臨時(shí)對(duì)象賦值給左邊的對(duì)象
  5. 調(diào)用析構(gòu)函數(shù)刪除這個(gè)臨時(shí)對(duì)象

現(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)換)”

好了,收工,哈哈

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++中explicit關(guān)鍵字的使用
Qt C++中的關(guān)鍵字explicit
直接初始化與復(fù)制初始化
[C++]explicit解釋
C++中的explicit關(guān)鍵字
c++關(guān)鍵字explicit使用指南
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服