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

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

C++構造函數和析構函數

2019-11-06 06:10:30
字體:
來源:轉載
供稿:網友

構造函數和析構函數

一.構造函數

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

(注:構造函數沒有this指針)

1.      構造函數的幾個特點:

函數名與類名相同

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

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

構造函數可以重載

構造函數可以寫在類體內,也可以寫在類體外

2.      構造函數的調用形式

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

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

下面是構造函數的使用方法

#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;}上面代碼中主函數中的構造函數的使用是采用第一種方式,這里再提供第二種方式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動態建立的對象一般是不用對象名的,而是通過指針進行訪問。如果不需要時,可以通過delete進行釋放。

二. 成員初始化列表

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

例如在構造函數的定義中可以使用如下的方式:

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

帶有成員列表的構造函數一般的形式如下:

類名 ::構造函數名([參數表]):[(成員初始化列表)]

{}

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

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

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

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

三. 帶默認參數的構造函數(帶缺省參數)

   在構造函數中,有一些成員值是不變的,這時我們可以使用帶默認參數的構造函數

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

四. 析構函數

析構函數也是一種特殊的成員函數,它通常用于撤銷對象時的一些清理任務

析構函數的特點如下:

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

析構函數沒有參數,也沒有返回值,而且不能重載。

析構函數自動被調用

例子:

同樣是上文的Date類,我們可以在定義類的時候定義析構函數,如

class Date

{

  …

  ~Date();

}

 

Date::~Date()

{

 cout<<”destruting …”<<endl;

}

 

在以下情況下,當對象的聲明周期結束時,析構函數會被自動調用

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

(2). 如果一個對象被定義在一個函數體內,則當這個函數調用結束時,該函數應該釋放,析構函數自動被調用

(3). 若一個對象是使用new運算符進行動態創建的,在使用delete運算符釋放它時,delete會調用析構函數。

五. 默認的構造函數和默認的析構函數

   1.默認的構造函數(系統自帶的構造函數,全參數構造函數,無參的構造函數都可以叫默認的構造函數)

   一般寫程序時會定義構造函數,但是如果沒有定義構造函數,系統會自動生成一個構造函數,這就是默認的構造函數。上面的程序中,如果沒有定義構造函數,而直接使用Date date1;這時系統會為Date類生成下面形式的構造函數:

Date ::Date()

{}

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

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

      只要一個類定義了一個構造函數,系統將不再給它提供默認的構造函數

3.      默認的析構函數

每個類都有一個析構函數,如果一個類沒有定義析構函數,那么編譯系統會自動的生成一個析構函數。

注意:在C++調用構造函數的時候注意不能出現這種形式例如有一個類Date,這個時候實例化一個對象Date date();這里不是調用了這個構造函數,而是一個函數的聲明,是錯誤的,如果不給這個對象傳遞參數就不要寫后面的括號,傳遞參數的時候寫括號,后面在加入參數。

六.拷貝構造函數

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

     拷貝構造函數的幾個特點:

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

2.      拷貝構造函數只有一個參數,而且是同類對象的引用

3.      每個類都有一個拷貝構造函數,可以自己定義用于初始化新的對象,如果沒有定義系統會自動的定義,用于復制與數據成員值相同的對象。

拷貝構造函數的使用:

1.      自定義拷貝構造函數

自定義拷貝構造函數的一般形式如下:

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

 

自定義拷貝構造函數的調用:

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

賦值發:類名 對象2 = 對象1;

2.      默認的拷貝構造函數

如果用戶沒有定義自定義的拷貝構造函數,然后又使用了拷貝構造函數,系統會調用默認的拷貝構造函數,例如Rectangle p2(p1);此時會把p1中各個域的值均復制給p2

3.      調用拷貝構造函數的三種情況

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

(2)    當函數的形參是類的對象,調用函數進行形參和實參結合時

(3)    當函數的返回值是對象,函數執行完成返回調用者時

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

 

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

 

六. 淺拷貝和深拷貝

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

 

  


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品欧美日韩专区| 亚洲天堂2020| 欧美日韩在线另类| 97国产精品人人爽人人做| 日本精品一区二区三区在线播放视频| 日韩国产在线播放| 91福利视频在线观看| 欧美亚洲日本黄色| 性欧美xxxx视频在线观看| 欧美在线观看网址综合| 超碰日本道色综合久久综合| 激情成人在线视频| 成人激情视频小说免费下载| 精品久久久久久久久久久久久久| 亚洲热线99精品视频| 日韩欧美一区视频| 中文字幕亚洲国产| 亚洲欧美三级伦理| 性欧美办公室18xxxxhd| 日韩欧美在线播放| 中文字幕一精品亚洲无线一区| 亚洲电影天堂av| 久久成人精品一区二区三区| 国产成人高潮免费观看精品| 深夜福利亚洲导航| 日韩一二三在线视频播| 亚洲视频欧洲视频| 精品国产一区二区三区久久久狼| 一本一本久久a久久精品牛牛影视| 成人激情在线观看| 国产99在线|中文| 一本色道久久综合狠狠躁篇怎么玩| 国产精品美女av| 亚洲精品www久久久| 欧美自拍大量在线观看| 亚洲福利视频在线| 亚洲美女av电影| 国产精品久久久久久亚洲调教| 欧美日韩精品国产| 亚洲成成品网站| 久久伊人精品天天| 国产精品一二区| 久久精品99久久香蕉国产色戒| 在线观看欧美日韩| 欧美性xxxxhd| 久久久这里只有精品视频| 久久99热这里只有精品国产| 日韩在线中文字幕| 国产视频丨精品|在线观看| 成人亚洲综合色就1024| 日韩av中文在线| 日韩影视在线观看| 日韩中文字幕av| 国产精品一区二区性色av| 亚洲免费成人av电影| 日韩在线观看电影| 久久久久久国产精品| 欧美日韩视频在线| 欧美高清第一页| 日韩免费在线免费观看| 国产精品久久久久久久app| 91在线免费观看网站| 国产91对白在线播放| 精品调教chinesegay| xxxx欧美18另类的高清| 亚洲综合在线小说| 国产日韩欧美视频| 国产亚洲视频在线观看| 欧美大奶子在线| 欧美激情欧美激情在线五月| 国产精品丝袜白浆摸在线| 国产一区二区三区中文| 国产精品偷伦免费视频观看的| 国产精品久久久久福利| 国产精品99导航| 欧美日韩国产麻豆| 亚洲国产精品电影在线观看| 欧美高清不卡在线| 欧美www在线| 国产美女91呻吟求| 欧美一级大片在线免费观看| 欧美日韩aaaa| 亚洲丝袜一区在线| 亚洲直播在线一区| 国产成人精品免费久久久久| 91在线免费视频| 亚洲成年人在线播放| 亚洲国产成人精品久久| 俺去啦;欧美日韩| 国产精品久久久精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美丰满少妇xxxx| 日韩一区二区精品视频| 久久久综合av| 欧美精品情趣视频| 中文字幕亚洲欧美日韩2019| 奇米一区二区三区四区久久| 亚洲欧美中文字幕在线一区| 亚洲精品一区二区三区不| 狠狠综合久久av一区二区小说| 日韩黄色高清视频| 久久综合网hezyo| 日韩免费在线视频| 中文字幕欧美精品日韩中文字幕| 国产精品com| 亚洲国产精品一区二区三区| 亚洲一区美女视频在线观看免费| 精品国产区一区二区三区在线观看| 亚洲韩国日本中文字幕| 欧美性猛交xxxx免费看| www亚洲精品| 一本色道久久综合亚洲精品小说| 久热精品视频在线免费观看| 国产午夜精品全部视频在线播放| 一本大道香蕉久在线播放29| 日本19禁啪啪免费观看www| 国产视频精品自拍| 性欧美xxxx视频在线观看| 热re91久久精品国99热蜜臀| 成人免费视频在线观看超级碰| 精品日韩美女的视频高清| 青青草原一区二区| 久久久久久久久久久国产| 8050国产精品久久久久久| 欧美激情免费观看| 日韩亚洲欧美中文在线| 91成品人片a无限观看| 亚洲国产美女久久久久| 欧美精品videofree1080p| 91深夜福利视频| 欧美大全免费观看电视剧大泉洋| 亚洲xxxx18| 色多多国产成人永久免费网站| 亚洲精品日产aⅴ| 啪一啪鲁一鲁2019在线视频| 欧美午夜片欧美片在线观看| 青青草原成人在线视频| 911国产网站尤物在线观看| 亚洲国产日韩一区| 久久亚洲一区二区三区四区五区高| 国产精品天天狠天天看| 亚洲天堂免费在线| 在线观看不卡av| 亚洲国产精品一区二区三区| 欧美视频在线观看免费| 成人国产精品日本在线| 亚洲国产精品成人一区二区| 欧美成aaa人片免费看| 日韩av在线直播| 国产精品一区二区三区免费视频| 成人在线视频网站| 日韩欧美在线视频免费观看| 亚洲综合中文字幕68页| 91视频国产一区| 97国产精品人人爽人人做| 俺去啦;欧美日韩| 久久久久国产精品免费网站| 日本精品在线视频| 亚洲图片在区色| 日韩国产高清视频在线| 美女av一区二区| 国产成人高清激情视频在线观看| 一区三区二区视频| 美日韩精品免费视频|