亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++構(gòu)造函數(shù)和析構(gòu)函數(shù)

2019-11-06 06:10:30
字體:
供稿:網(wǎng)友

構(gòu)造函數(shù)和析構(gòu)函數(shù)

一.構(gòu)造函數(shù)

構(gòu)造函數(shù)時一種特殊的函數(shù),它主要用于為對象分配空間,進行初始化。

(注:構(gòu)造函數(shù)沒有this指針)

1.      構(gòu)造函數(shù)的幾個特點:

函數(shù)名與類名相同

參數(shù)任意,但是沒有返回值,viod也不行

它是在實例化對象的時候自動的調(diào)用,而不需要用戶調(diào)用

構(gòu)造函數(shù)可以重載

構(gòu)造函數(shù)可以寫在類體內(nèi),也可以寫在類體外

2.      構(gòu)造函數(shù)的調(diào)用形式

(1)     類名對象名[(實參表)]

(2)     類名 *指針變量名 = new 類名[(實參表)]

下面是構(gòu)造函數(shù)的使用方法

#include<iostream>usingnamespace std; classDate{PRivate:    int year;    int month;    int day;public:    Date(int y,int m,int d);    voidsetDate(int y,int m,int d);    voidshowDate();}; Date::Date(inty, intm, intd){    cout << "Constcuting..." << endl;    year = y;    month = m;    day = d;} voidDate::setDate(inty, intm, intd){    year = y;    month = m;    day = d;} inlinevoidDate::showDate(){    cout <<year << "." << month << "."<< day << endl;} int main(){    Datedate1(2017,3,2);    cout << "date1:" << endl;    date1.showDate();    date1.setDate(2017,3,3);    cout << "date2:" << endl;    date1.showDate();    return 0;}上面代碼中主函數(shù)中的構(gòu)造函數(shù)的使用是采用第一種方式,這里再提供第二種方式int main(){    Date *pdate;    pdate = newDate(2017,2,3);    cout << "Date1" << endl;    pdate->showDate();    pdate->setDate(2017,2,3);    cout << "Date2" << endl;    pdate->showDate();    return 0; }

這段代碼中編譯器開辟了一個存儲空間,并且存放了一個Date類,但是這個對象沒有名字,成為無名對象,但是該對象有地址,這個地址存放在pdate中,我們通過指針可以找到他,訪問時用new動態(tài)建立的對象一般是不用對象名的,而是通過指針進行訪問。如果不需要時,可以通過delete進行釋放。

二. 成員初始化列表

  C++還提供了另一種初始化成員的方法——用成員初始化列表來實現(xiàn)對數(shù)據(jù)成員的初始化,這種方法不在函數(shù)體內(nèi)用賦值語句,而是在函數(shù)首部實現(xiàn)的。

例如在構(gòu)造函數(shù)的定義中可以使用如下的方式:

Date::Date(inty, intm, intd) :year(y),month(m), day(d){    cout << "Constcuting..." << endl;}

帶有成員列表的構(gòu)造函數(shù)一般的形式如下:

類名 ::構(gòu)造函數(shù)名([參數(shù)表]):[(成員初始化列表)]

{}

成員初始化列表的一般形式為:

數(shù)據(jù)成員名1(初始值1),數(shù)據(jù)成員名2(初始值2),…

成員初始化列表有什么用途呢,一般對于const修飾的數(shù)據(jù)成員,或者是引用類型的數(shù)據(jù)成員。

注意:使用成員初始化列表初始化的時候,它的初始化的順序是按照在類中聲明的順序進行初始化的,而不是按照成員初始化列表中的順序進行初始化。

三. 帶默認(rèn)參數(shù)的構(gòu)造函數(shù)(帶缺省參數(shù))

   在構(gòu)造函數(shù)中,有一些成員值是不變的,這時我們可以使用帶默認(rèn)參數(shù)的構(gòu)造函數(shù)

   意思就是我們在定義構(gòu)造函數(shù)時,可以在形參的部分隊參數(shù)進行賦初值。

四. 析構(gòu)函數(shù)

析構(gòu)函數(shù)也是一種特殊的成員函數(shù),它通常用于撤銷對象時的一些清理任務(wù)

析構(gòu)函數(shù)的特點如下:

析構(gòu)函數(shù)和構(gòu)造函數(shù)名字相同,但是它的前面必須加一個波浪號(~)

析構(gòu)函數(shù)沒有參數(shù),也沒有返回值,而且不能重載。

析構(gòu)函數(shù)自動被調(diào)用

例子:

同樣是上文的Date類,我們可以在定義類的時候定義析構(gòu)函數(shù),如

class Date

{

  …

  ~Date();

}

 

Date::~Date()

{

 cout<<”destruting …”<<endl;

}

 

在以下情況下,當(dāng)對象的聲明周期結(jié)束時,析構(gòu)函數(shù)會被自動調(diào)用

(1). 如果定義了一個全局對象,則在程序流離開作用域(如main()函數(shù)結(jié)束或者調(diào)用exit()函數(shù))時,調(diào)用該全局對象的析構(gòu)函數(shù)。

(2). 如果一個對象被定義在一個函數(shù)體內(nèi),則當(dāng)這個函數(shù)調(diào)用結(jié)束時,該函數(shù)應(yīng)該釋放,析構(gòu)函數(shù)自動被調(diào)用

(3). 若一個對象是使用new運算符進行動態(tài)創(chuàng)建的,在使用delete運算符釋放它時,delete會調(diào)用析構(gòu)函數(shù)。

五. 默認(rèn)的構(gòu)造函數(shù)和默認(rèn)的析構(gòu)函數(shù)

   1.默認(rèn)的構(gòu)造函數(shù)(系統(tǒng)自帶的構(gòu)造函數(shù),全參數(shù)構(gòu)造函數(shù),無參的構(gòu)造函數(shù)都可以叫默認(rèn)的構(gòu)造函數(shù))

   一般寫程序時會定義構(gòu)造函數(shù),但是如果沒有定義構(gòu)造函數(shù),系統(tǒng)會自動生成一個構(gòu)造函數(shù),這就是默認(rèn)的構(gòu)造函數(shù)。上面的程序中,如果沒有定義構(gòu)造函數(shù),而直接使用Date date1;這時系統(tǒng)會為Date類生成下面形式的構(gòu)造函數(shù):

Date ::Date()

{}

并且使用這個默認(rèn)的構(gòu)造函數(shù)對date1進行初始化,但是這個構(gòu)造函數(shù)沒有任何參數(shù),它只能開辟一個存儲空間,而不能給對象中的數(shù)據(jù)成員賦值,這時的初始值是個隨機數(shù),程序運行的時候可能會造成錯誤。

補充說明:對沒有定義構(gòu)造函數(shù)的類,其公有數(shù)據(jù)成員可以用初始值列表進行初始化。

      只要一個類定義了一個構(gòu)造函數(shù),系統(tǒng)將不再給它提供默認(rèn)的構(gòu)造函數(shù)

3.      默認(rèn)的析構(gòu)函數(shù)

每個類都有一個析構(gòu)函數(shù),如果一個類沒有定義析構(gòu)函數(shù),那么編譯系統(tǒng)會自動的生成一個析構(gòu)函數(shù)。

注意:在C++調(diào)用構(gòu)造函數(shù)的時候注意不能出現(xiàn)這種形式例如有一個類Date,這個時候?qū)嵗粋€對象Date date();這里不是調(diào)用了這個構(gòu)造函數(shù),而是一個函數(shù)的聲明,是錯誤的,如果不給這個對象傳遞參數(shù)就不要寫后面的括號,傳遞參數(shù)的時候?qū)懤ㄌ?,后面在加入?yún)?shù)。

六.拷貝構(gòu)造函數(shù)

     拷貝構(gòu)造函數(shù)的形參是本類對象的引用,拷貝構(gòu)造函數(shù)的作用是在建立一個新得對象時,使用一個已經(jīng)存在的對象去初始化這個新對象。形如:Point p2(p1);

     拷貝構(gòu)造函數(shù)的幾個特點:

1.      因為拷貝構(gòu)造函數(shù)也是構(gòu)造函數(shù),所以它的函數(shù)名必須與類名相同,而且也沒有返回值

2.      拷貝構(gòu)造函數(shù)只有一個參數(shù),而且是同類對象的引用

3.      每個類都有一個拷貝構(gòu)造函數(shù),可以自己定義用于初始化新的對象,如果沒有定義系統(tǒng)會自動的定義,用于復(fù)制與數(shù)據(jù)成員值相同的對象。

拷貝構(gòu)造函數(shù)的使用:

1.      自定義拷貝構(gòu)造函數(shù)

自定義拷貝構(gòu)造函數(shù)的一般形式如下:

類名::類名(const 類名 &對象名)

 

自定義拷貝構(gòu)造函數(shù)的調(diào)用:

代入法:類名 對象2(對象1);

賦值發(fā):類名 對象2 = 對象1;

2.      默認(rèn)的拷貝構(gòu)造函數(shù)

如果用戶沒有定義自定義的拷貝構(gòu)造函數(shù),然后又使用了拷貝構(gòu)造函數(shù),系統(tǒng)會調(diào)用默認(rèn)的拷貝構(gòu)造函數(shù),例如Rectangle p2(p1);此時會把p1中各個域的值均復(fù)制給p2

3.      調(diào)用拷貝構(gòu)造函數(shù)的三種情況

(1)    當(dāng)用類的一個對象去初始化類的另一個對象的時候

(2)    當(dāng)函數(shù)的形參是類的對象,調(diào)用函數(shù)進行形參和實參結(jié)合時

(3)    當(dāng)函數(shù)的返回值是對象,函數(shù)執(zhí)行完成返回調(diào)用者時

        下面是具體的程序,還有注釋部分,注釋部分就是上面各種的講解

 

   #include<iostream>usingnamespace std; classRectangle{private:    int_length;    int _width;public:    Rectangle(int len =10, int wid =10); //構(gòu)造函數(shù)    Rectangle(constRectangle&p);  //拷貝構(gòu)造函數(shù)    void disp();}; Rectangle::Rectangle(intlen, intwid)  //構(gòu)造函數(shù){    _length = len;    _width = wid;    cout << "usingnormal constructor" << endl;} Rectangle::Rectangle(constRectangle &p)  //拷貝構(gòu)造函數(shù){    _length = 2 * p._length;    _width = 2 * p._width;    cout << "usingcopy constructor" << endl;} voidRectangle::disp(){    cout <<_length << " " << _width << endl;} void fun1(Rectanglep){    p.disp();} Rectangle fun2(){    Rectanglep4(10,30);     //這里調(diào)用了普通的構(gòu)造函數(shù)    returnp4;             //這里返回的一個Rectangle的對象,我們會使用p2 = fun2();去接受他的返回值,所以這里相當(dāng)于給p2用了一個拷貝構(gòu)造函數(shù)} int main(){    Rectangle p1(30,40);  //定義了p1,調(diào)用構(gòu)造函數(shù)    p1.disp();    Rectanglep2(p1);   //調(diào)用拷貝構(gòu)造函數(shù)把p1里面的值全部復(fù)制給p2(情況1)    p2.disp();    Rectangle p3 =p1;  //調(diào)用拷貝構(gòu)造函數(shù),把p1的值復(fù)制給p3(情況1)    p3.disp();    fun1(p1);   //這個時候傳入的是p1的一份引用,然后會調(diào)用Rectangle的拷貝構(gòu)造函數(shù)                //這里應(yīng)該思考的一個問題就是,為什么調(diào)用的是Rectangle的拷貝構(gòu)造函數(shù),這里我的一個猜測是,直接傳一個對象的時候,就像傳數(shù)組名一樣了,發(fā)生了一個轉(zhuǎn)換之類的                //可能就把對象轉(zhuǎn)換成對象的一個引用了吧    p1.disp();    p2 =fun2();   //函數(shù)的返回值是對象,屬于第三種情況調(diào)用拷貝構(gòu)造函數(shù)    p2.disp();    system("pause");    return 0;}

 

六. 淺拷貝和深拷貝

 所謂淺拷貝,就是如果沒有自定義拷貝構(gòu)造函數(shù)而直接使用的話,就只是單純的進行值得賦值,但是當(dāng)類的數(shù)據(jù)成員有指針類型的時候,并且在使用指針的時候,給這個指針動態(tài)的開辟了一個新的循存儲空間的話,當(dāng)我實例化一個對象a之后,a里面的一個數(shù)據(jù)成員p動態(tài)的開辟了一個存儲空間,然后我有實例化b,而且是通過調(diào)用未定義的拷貝構(gòu)造函數(shù),這樣就直接把a里面的內(nèi)容給了b,b里面的一個指針也指向剛剛a里面的內(nèi)存空間,這時候就出現(xiàn)了一種情況就是當(dāng)我調(diào)用析構(gòu)函數(shù)清理a 的內(nèi)存空間的時候,因為b中的指針也指向了那片空間,所以此時b中的那個指針就沒有意義了,這就造成了錯誤。所以建議再使用指針的相關(guān)操作的時候,盡量去自定義拷貝構(gòu)造函數(shù)。

 

  


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

在线中文字幕视频观看| 欧美性bbwbbwbbwhd| 日韩精品视频在线播放| 亚洲人成网站在线在线观看| 久久久99精品久久| 中文无码精品一区二区三区| 日本aⅴ免费视频一区二区三区| 日韩人妻无码精品久久久不卡| 国产精品特级毛片一区二区三区| 亚洲成成品网站| 欧美激情视频免费观看| 久久国产小视频| 日韩精品一线二线三线| 久久精品久久精品久久| 欧美久久一区二区| 亚洲国产91精品在线观看| 亚洲国产精品专区久久| 日本中文字幕一区二区有限公司| 精品福利在线看| 免费毛片小视频| 亚洲精品国产欧美| 欧美日韩大尺度| 99久久精品免费视频| 亚洲精品视频在线播放| 丰满少妇被猛烈进入| 欧美不卡在线| 性感美女激情视频在线观看| 激情国产一区二区| 久久久久久国产精品久久| 国产精品久久久久久久一区二区| 日韩精品极品视频在线观看免费| 热久久免费视频精品| 黑丝美女久久久| 日本道免费精品一区二区三区| 中文视频一区| 日韩av片免费观看| 97品白浆高清久久久久久| 性欧美8khd高清极品| 日韩av影视在线| 亚洲精品国产精品乱码不卡| 91精品国产自产在线老师啪| 中文字幕亚洲欧美日韩| 亚洲www啪成人一区二区| 国产精品色哟哟| 97精品国产97久久久久久粉红| 麻豆一区二区在线观看| 性欧美videos另类hd| 国产无遮挡裸体免费视频| 成人高清免费观看| 综合久久国产九一剧情麻豆| 佐山爱痴汉视频一区二区三区| 亚洲影视在线观看| 久久久亚洲精品一区二区三区| 日韩不卡视频一区二区| 亚洲人成电影网站色xx| 日本视频二区| 99精品视频国产| 免费成人在线影院| 黄色一二三区| 午夜免费福利网站| 美女日批在线观看| 天天综合天天做| 色婷婷久久一区二区| 国产成人亚洲欧洲在线| www.污视频| 亚洲高清色综合| 日韩三级免费看| 伊人精品在线| 99久久99久久精品国产片| 不卡av电影在线观看| 污污网站在线免费观看| 国产精品美女免费| 无码日韩精品一区二区免费| 免费在线视频观看| 日韩欧美性视频| 日韩三级电影网址| 午夜影院免费视频| 中文字幕在线中文| 精品久久久久久久久久久aⅴ| 国产日韩欧美自拍| 中国一区二区视频| 亚洲国产美女| 99久久久无码国产精品免费| 久久久久久久激情| 欧美日韩国产综合新一区| 亚洲国产综合av| 18以下岁禁止1000部免费| 欧美成年人视频在线观看| 婷婷久久综合网| 亚洲麻豆一区二区三区| 天堂在线视频播放| aaa在线播放视频| 亚洲一区三区在线观看| 北岛玲日韩精品一区二区三区| 久久久久久欧美| 欧美一区二区三区……| 亚洲在线视频网站| 色综合久久久久久久久久久| 久久久久国产精品熟女影院| 先锋影音在av资源看片| 欧妇女乱妇女乱视频| 天天在线免费视频| 欧亚在线中文字幕免费| 日韩av电影网址| 日韩欧美在线综合网| 久久综合综合久久| 亚洲日本中文字幕| 午夜久久久久久久久久| 欧美性猛交xxxx乱大交91| 国产成人午夜电影网| 国产亚洲美州欧州综合国| 北条麻妃视频在线| 一本色道久久综合无码人妻| 日本中文在线观看| 国产99久久久久久免费看农村| 综合激情五月婷婷| 欧美精品第三页| 可以在线看的黄色网址| 免费在线你懂的| 精品国产亚洲在线| 97香蕉超级碰碰久久免费的优势| 性少妇videosexfreexxx片| 午夜亚洲福利老司机| 国产精品爱久久久久久久| 91精品中文字幕一区二区三区| 影音先锋黄色资源| 国产精品视频二区三区| 成人黄视频在线观看| 国语自产精品视频在线看8查询8| 国产精品一卡二卡在线观看| 国产一区二区三区四区五区在线| 天天操天天爽天天干| 久久人体视频| 91啪九色porn原创视频在线观看| 国产不卡视频| 在线免费观看日本一区| 国模一区二区三区| 性欧美精品高清| a视频在线观看| 性欧美video另类hd3| 中文字幕精品在线播放| 欧美特黄一区| av一区二区三区四区电影| 国模吧无码一区二区三区| 国产在线视频第一页| 亚洲欧洲日韩精品在线| 久久精品亚洲一区二区三区浴池| 国内视频一区| 曰本三级日本三级日本三级| 免费欧美激情| 国产情侣小视频| 中文字幕免费高清电视剧网站在线观看| 成人av综合在线| 国产欧美久久久久| 国产字幕在线观看| 青春娱乐分类视频精品2动漫| 天天做天天躁天天躁| 好男人中文字幕官网| 亚洲成av人乱码色午夜| 亚洲狠狠爱一区二区三区| 18黄暴禁片在线观看| 亚洲一级免费视频| 亚洲制服在线观看| h文在线观看免费| 日本不卡视频在线| 欧美极品在线播放| 国内精品久久久久久久久| 久久国产成人午夜av影院| 国产亚洲精品精华液| 国产天堂亚洲国产碰碰| 日韩在线观看免费高清| 福利视频一区二区| 五月婷婷激情在线| 在线a人片免费观看视频| 欧洲av一区二区嗯嗯嗯啊| 日韩精品极品在线观看播放免费视频| 99久久免费国产精品| 亚洲私拍视频| 一区二区美女| 91激情在线| 成人福利一区二区| 精品人妻一区二区三区四区在线| 成年人在线视频免费观看| 少妇久久久久久久久久| 超级碰碰视频| 337p亚洲精品色噜噜噜| 在线成人欧美| 精品爽片免费看久久| 国产成人精品午夜视频免费| 国产777精品精品热热热一区二区| 国产在线精品免费| 亚洲精品综合精品自拍| 黄色一级大片在线免费看国产一| 91激情在线| 欧美大秀在线观看| 欧美在线视频一区二区| 成人免费在线观看入口| 一区二区三区免费在线看| 免费无遮挡无码永久在线观看视频| 337p粉嫩大胆噜噜噜噜噜91av| 2020国产精品| 日本黄色一区| 久久精品色妇熟妇丰满人妻| 亚洲国产精品欧美久久| 青青草av专区| 欧美日韩和欧美的一区二区| 在线视频自拍| 欧美人成在线| 中文字幕一区二区三区免费看| 免费观看成人性生生活片| 久久亚洲国产中v天仙www| 在线欧美激情| 综合久久久久| 少妇精品久久久一区二区| 久久999免费视频| 国产一区在线观看视频| 久久精品a一级国产免视看成人| 视频在线不卡免费观看| av网站免费在线| 蜜臀av性久久久久蜜臀av| 国产亚洲激情在线| 日韩视频一区在线观看| 欧美大尺度激情区在线播放| 自拍视频一区二区| 欧美亚洲国产精品| 午夜精品美女自拍福到在线| 最近更新在线中文字幕一页| 欧美视频二区欧美影视| 黄色免费一级视频| 国产真实夫妇交换视频| 免看一级a毛片一片成人不卡| 欧美一区亚洲一区| 亚洲中文字幕无码一区| 久久先锋资源网| 欧美动漫一区二区| 国产精品538一区二区在线| 色又黄又爽网站www久久| 国产高清无密码一区二区三区| 尤蜜粉嫩av国产一区二区三区| 国产精品久久久久白浆| 偷偷www综合久久久久久久| 亚洲成色999久久网站| 国产美女在线免费观看| 91在线网址| 国产精品伦一区| 国产精品99久久久久久成人| 456亚洲精品成人影院| 黄色成年人视频在线观看| 91亚洲国产成人精品一区| 午夜精品一区二区三| 91在线观看入口| 国产高中女学生第一次| 日本在线观看视频一区| 妓院一钑片免看黄大片| 性刺激综合网| 亚洲电影观看| 99亚洲国产精品| av中文在线观看| 成人av网页| 日韩久久综合| 伊人手机在线| jlzzjizz在线播放观看| 91精品国产综合久久久久久豆腐| 久久se这里有精品| 蜜臀av.com| 国产精品对白| 884aa四虎影成人精品一区| 亚洲一区二区三区视频播放| 国产黄频在线观看| 高清一区二区视频| 91精品国产入口在线| 国产精品一区二区女厕厕| 国产欧美日韩精品一区二区三区| 97超碰人人澡| 国产视频在线免费观看| 欧美日本另类xxx乱大交| 一区二区三区在线免费视频| 日韩欧美一区二区三区在线视频| 欧美高清www午色夜在线视频| 成人羞羞国产免费| 欧美一区二区三区在| 制服 丝袜 综合 日韩 欧美| 欧美专区日韩专区| 99久久精品无免国产免费| 一区二区三区视频免费在线观看| 国模吧一区二区三区| 中文字幕亚洲欧美一区二区三区| 精品中文字幕一区二区三区四区| 亚洲一区二区影院| 日韩五码在线| 久久久久久久久久电影| 日本wwwwww| 欧美午夜免费影院| 福利在线播放| 黑人40厘米全进去| 国产成人综合av| 亚洲国产另类久久久精品极度| 中文字幕成人在线| 99久久精品无免国产免费| 成人免费观看毛片| 国产精品一区二区免费视频| 又污又黄的网站| 国产精品国产自产拍高清av王其| 国产原创在线播放| 欧美变态凌虐bdsm| www激情久久| 最近日韩中文字幕中文| 成人h片在线播放免费网站| 欧美日本网站| 国产乱码一区二区三区四区| 亚洲午夜色婷婷在线| 日本激情视频网| 欧美三级午夜理伦三级在线观看| 2019中文字幕在线免费观看| 欧美三级精品| 欧美经典一区| 日本1级在线| 一区二区三区中文字幕在线观看| 欧美极品aⅴ影院| 欧美二区不卡| 欧美高清电影在线看| 欧美精品色图| 日本免费三片免费观看| 国产麻豆一区二区三区| 高清一区二区| 国产一级片免费观看| 国产精品中文字幕日韩精品| 欧美日韩精品福利|