在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

由始至終----構造與析構(轉轉)

由始至終----構造與析構(轉轉)

更新時間:2022-05-03 文章作者:未知 信息來源:網絡 閱讀次數:

由始至終

 ----構造與析構

作者:HolyFire

我們在平時的生活中一般會總結出一些規律,早上起床會刷牙洗臉,晚上會洗澡睡覺,這些都成了慣例。使用瓶裝調味品時先將瓶蓋打開,用完后將瓶蓋蓋上。這是一種好習慣。但是有些人不同,他們往往偷懶,一個常常不刷牙不洗臉不洗澡的人會有體味,東西放得亂七八糟的人生房間很不整潔。這些都是我們不希望看到的。當然編程中我們也不希望代碼亂七八糟。

使用一個未初始化的變量簡直就是災難,使用一個未初始化的指針將導致崩潰。這是我的忠告。在C++中初始化不會有附加的效果,不會降低效率,我們要做的是養成好習慣,產生一個對象的時候就將它初始化。

對于

Object.Init();

Object.Free();

這樣的調用并不是很困難,要記住他也不是難事,但是誰都不能保證他永遠不會忘記,更糟糕的是

Object.Init();

Object.Free();

沒有配對使用

Object.Init();

Object.Free();

Object.Free();



Object.Init();

Object.Init();

Object.Free();

會帶來什么樣的結果,誰也不知道,而且這樣的錯誤,編譯器不會報錯。這是多么可怕的錯誤,一個程序員最怕遇上的就是這樣的邏輯錯誤,它可能為了找這樣的一個錯誤花上一整天時間。

讓我們看看有什么好的辦法。

一個對象按時間來分析,一般有三個階段,出生,活動,死亡。與我們要做的有什么相關之處呢,初始化,運行,釋放。很好,對照一下,我們發現在對象出生的時候初始化,死亡的時候釋放,如果這一切能用這樣的機制來操作,我們就再也不用擔心會由于忘記或錯誤的使用帶來麻煩了。

C++里就提供了這樣的機制。使用他有個約定

class Object{

public:

 Object(); //與類同名的函數,該函數沒有返回值,叫做構造函數

~Object();//類似的,在構造函數名前加一個取反符號,叫做析構函數

};

構造函數將在對象產生的時候調用

析構函數將在對象銷毀的時候調用

調用的過程和實現方法由編譯器完成,我們只要記住他們調用的時間就行了,而且他們的調用是自動完成的,不需要我們控制。

#include <iostream>

using namespace std;

class Object{

public:

 Object(){ cout << "Object ON!" << endl; }

 ~Object(){ cout << "Object OFF!" << endl; }

};

void main()

{

 Object o;

}

運行結果

Object ON!

Object OFF!

構在函數和析構函數確實的執行了

現在我們來一個應用的例子

一個字符串類,它需要保存字符串的內容,但是它不知道字符串的大小,那么設計這個字符串類的時候,保存字符串的成員變量就不能用固定大小的數組,而是用可以間接操作數組的指針。

#include <iostream>

#include <string.h>

using namespace std;

class string{

private:

 char * data;

public:

 string(){ data = NULL; }

 string( char * str )

{

cout << "Copy string: " << str << endl;

data = new char[ strlen(str) + 1 ];

memcpy( data , str , strlen(str) + 1 );

}

 char * Data(){ return data; }

 ~string()

{

if( data )

 {

 cout << "Free string: " << data << endl;

 delete data;

 }

}

};

void main()

{

 {

string s("abcd");

 cout <<"Show String: " << s.Data() <<endl;

}

cin.get();

}

Copy string: abcd //執行了string::string( char * str ) 構造函數

Show String: abcd

Free string: abcd //由于在{}中產成的對象是臨時對象,它的生命期在}后就結束了,所以string::~string() 析構函數被調用

申請內存和釋放內存的操作自動完成了,構造函數和析構函數的目的在于一個類可以象普通類型一樣初始化和釋放,從而保證了封裝。

上面的例子有兩個構造函數,這么什么大不了的,我們看過《面面俱到----重載》得都知道,重載的把戲。

要注意的是構造函數可以有參數,在繼承中如何處理呢。

class mystring : public string{

public:

 mystring( char * str ):string( str ){ }

}

mystring( char * str ):string( str )

記住這樣的形式,給自己的父類傳遞函數就用這樣的書寫格式,這是一個約定。

構造函數后面加上一個:表示后面是一個初始化序列,說它是一個序列是因為它可以初始化多個成員變量,在初始化序列里調用向父類傳遞參數是為了保證類的產生的順序,先產生父類,然后是子類。使用初始化有個好處就是可以提高效率。

string(){ data = NULL; }

可以改寫成

string():data(NULL){ }

他的作用是產生成員變量char * data時將他的值置為NULL。從而少了data = NULL;這步操作。

注意,這里構造和析構有一個順序問題,就是構造時應該從基類開始按繼承的層次順序調用,析構的時候順序正好相反。這樣處理是因為,子類可能在構造函數里使用父類的成員變量,如果父類還沒有創建,那就會有問題,而析構的時候,如果父類先析構,也會有這樣的問題。

析構函數還有一個能否正確運行的問題。

#include <iostream>

using namespace std;

class One{

public:

 One(){ cout << "One ON!" << endl; }

 ~One(){ cout << "One OFF!" << endl; }

};

class Two : public One{

public:

 Two(){ cout << "Two ON!" << endl; }

 ~Two(){ cout << "Two OFF!" << endl; }

};

class Three : public Two{

public:

 Three(){ cout << "Three ON!" << endl; }

 ~Three(){ cout << "Three OFF!" << endl; }

};

void main()

{

 Three three;

}

運行結果

One ON!

Two ON!

Three ON!

Three OFF!

Two OFF!

One OFF!

正確

void main()

{

 Three * three = new Three;

delete three;

}

運行結果

One ON!

Two ON!

Three ON!

Three OFF!

Two OFF!

One OFF!

正確

void main()

{

 One * three = new Three;

delete three;

}

運行結果

One ON!

Two ON!

Three ON!

One OFF!

不好了,Two和Three的析構都沒有運行,怎么會這樣,原來One * three指出了指針指向的是一個One類的對象。如何得到正確的結果呢,如果能讓One類記住被繼承后的變化就好了。

對了!虛函數,在《后入為主----虛函數》中可以知道,虛函數有這個特性,不信試試看。

class One{

public:

 One(){ cout << "One ON!" << endl; }

 virtual ~One(){ cout << "One OFF!" << endl; }

};

void main()

{

 One * three = new Three;

delete three;

}

運行結果

One ON!

Two ON!

Three ON!

Three OFF!

Two OFF!

One OFF!

正確

這個特點很重要,我們要牢牢記住,我們稱這種方法為“虛析構”,在多態里運用非常廣泛,也是編寫可復用代碼的一個重要技巧。

構造和析構的作用機制就是自動化,簡化編程的復雜度。還有要記住的是,在一個類的構造函數里分配了的資源盡量要記得在該類的析構函數里釋放,當然也允許提前釋放,你可以在析構函數里判斷它是否已經釋放,如果沒有就釋放。這就是----由始至終,它間接的描述了一個對象的生和死(記住這一點很重要,因為我以后會講到如何運用這個特性控制對象的生死)。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 97中文字幕在线| 日韩毛片在线免费看| 妺妺窝人体色777777| 国产成人手机视频| 精品久久久久久无码中文野结衣| 国产色视频在线播放| 污污的网站18| 三区视频在线观看| 男人添女人下部视频免费| 欧美三级在线观看视频| 麻豆传传媒久久久爱| 99视频免费播放| 日本一道在线观看| 精品国产免费av| 免费成人黄色大片| 国产日韩欧美精品在线观看| www.在线观看av| 性欧美videossex精品| 黄色大片中文字幕| 久久精品国产露脸对白| 黄色一级视频播放| 国产天堂在线播放| 国产在线xxxx| 亚洲欧美偷拍另类| av动漫在线免费观看| 国产玉足脚交久久欧美| 国产第一页视频| 欧美三级一级片| 99国产精品白浆在线观看免费| 久章草在线视频| 国产在线精品91| 国产高清www| 97在线播放视频| 肉色超薄丝袜脚交| 免费看国产黄色片| 狠狠精品干练久久久无码中文字幕| 成人午夜免费剧场| 久久久精品高清| 国产免费黄色一级片| 天堂中文av在线| 天堂av手机在线| 亚洲国产精品无码av| 欧美 日韩精品| 日韩小视频在线播放| 男人的天堂视频在线| 五月天视频在线观看| 日本熟妇人妻xxxxx| 欧美日韩中文不卡| 伊人影院综合在线| 一级黄色片在线免费观看| www.午夜色| 无码aⅴ精品一区二区三区浪潮 | 噼里啪啦国语在线观看免费版高清版| 男人添女人下面高潮视频| 好吊色视频988gao在线观看| 在线观看免费黄色片| 国产午夜福利100集发布| 国产一区二区在线视频播放| 欧美伦理片在线看| 青青草精品视频在线| 黄色aaaaaa| 涩多多在线观看| 无码人妻精品一区二区三区66| 一级特黄性色生活片| 精品欧美一区免费观看α√| av 日韩 人妻 黑人 综合 无码| 97国产精东麻豆人妻电影| 欧美亚洲视频一区| 午夜免费福利在线| 免费av观看网址| 日韩精品一区在线视频| 五月六月丁香婷婷| 亚洲va综合va国产va中文| 日韩精品视频一区二区在线观看| 久久香蕉视频网站| 亚洲色图都市激情| av动漫在线免费观看| xxxx18hd亚洲hd捆绑| 乱子伦一区二区| 三上悠亚免费在线观看| 欧美另类videosbestsex日本| 中文精品无码中文字幕无码专区| 玖玖精品在线视频| 69sex久久精品国产麻豆| 国产精品入口芒果| 手机免费看av网站| 夜夜爽久久精品91| 17c丨国产丨精品视频| 国产精品欧美激情在线观看| 国产精品亚洲二区在线观看| 亚洲精品成人在线播放| 国产主播自拍av| 国产性生活一级片| 成人在线看视频| 国产黄色片免费在线观看| 先锋影音男人资源| 久久久福利影院| 中文字幕 日韩 欧美| xx欧美撒尿嘘撒尿xx| 免费一级特黄毛片| 另类小说第一页| 亚洲黄色av片| 国产一级片91| 99热一区二区| 欧美高清中文字幕| 欧美婷婷精品激情| 青春草在线视频免费观看| 黄色一级视频在线播放| 久久久久久久激情| 欧美一级裸体视频| 91女神在线观看| 老司机午夜性大片| 在线观看国产一级片| 2018中文字幕第一页| 久久久精品麻豆| 久久久国内精品| 成人亚洲精品777777大片| 欧美日韩视频免费在线观看| 欧美a级免费视频| 日韩不卡一二三| 久久久999免费视频| 看一级黄色录像| 182午夜在线观看| 日韩欧美黄色大片| 久久精品视频16| 日韩不卡一二区| 中文字幕永久视频| 欧美日韩亚洲一| 午夜国产福利在线观看| 丰满的少妇愉情hd高清果冻传媒 | www.国产福利| 亚洲精品一二三四五区| jizzjizzxxxx| 日批视频在线免费看| 国产freexxxx性播放麻豆| 一区二区三区一级片| 国产盗摄视频在线观看| 黄色a级三级三级三级| 精品免费国产一区二区| 国产麻花豆剧传媒精品mv在线| 777精品久无码人妻蜜桃| 亚洲美免无码中文字幕在线| 精品国产免费av| av亚洲天堂网| 国产玉足脚交久久欧美| 精品人妻一区二区三区四区在线 | 国产精品-区区久久久狼| jizz欧美激情18| 中文字幕成人在线视频| 91免费网站视频| 国产极品粉嫩福利姬萌白酱| 精品国产成人av在线免| av电影一区二区三区| 免费成人午夜视频| 法国空姐在线观看免费| 少妇黄色一级片| 欧美大片在线播放| 久久人妻无码一区二区| av污在线观看| 99精品免费在线观看| 成人午夜免费在线| 国产精品中文久久久久久| 久草综合在线观看| 国产乱叫456| 蜜桃视频一区二区在线观看| 九九精品久久久| 五月天视频在线观看| 污片在线免费看| 亚洲一区二区蜜桃| 九色porny自拍| 污污网站免费观看| 911av视频| 女女百合国产免费网站| avav在线播放| 日韩avxxx| 欧美一级免费在线| 欧美一级爱爱视频| 国产精品69页| 美女扒开大腿让男人桶| 中文字幕第36页| 在线免费黄色小视频| 丁香婷婷综合激情| 波多野结衣天堂| 久久人人爽人人爽人人av| 日韩av一二三四区| 亚洲国产精品无码av| av无码精品一区二区三区| 一级 黄 色 片一| aaa毛片在线观看| 欧美 日韩 国产精品| 91av俱乐部| 成人一对一视频| 久久久99精品视频| 91插插插影院| 91插插插插插插插插| av免费播放网址| 动漫av网站免费观看| 香港三级日本三级a视频| 丰满女人性猛交| 久久久精品高清|