成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

從結(jié)構(gòu)struct談到類class(基于C++實(shí)現(xiàn))

深入理解struct

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),德興網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:德興等地區(qū)。德興做網(wǎng)站價(jià)格咨詢:18982081108

 在C語(yǔ)言中,我們通常使用struct來(lái)表示不同數(shù)據(jù)類型的結(jié)合。當(dāng)然我們也可以在struct中定義函數(shù),在C++中,這是允許的但是不提倡使用,因?yàn)橛幸粋€(gè)比它更好使用的復(fù)雜數(shù)據(jù)類型,叫做類(這在稍后做出介紹)。

   使用struct的時(shí)候有一個(gè)問(wèn)題:在進(jìn)行一個(gè)比較大的項(xiàng)目工程的時(shí)候,我們的數(shù)據(jù)結(jié)構(gòu)的定義和使用可能在不同的文件中,當(dāng)我們修改了數(shù)據(jù)結(jié)構(gòu)中的某個(gè)成員,那么,使用該數(shù)據(jù)結(jié)構(gòu)的函數(shù)必須修改,而我們并不知道拿下函數(shù)使用該種數(shù)據(jù)結(jié)構(gòu),這時(shí)候我們?cè)趺醋??答案很?jiǎn)單,在函數(shù)定義的時(shí)候,讓該函數(shù)屬于該數(shù)據(jù)結(jié)構(gòu),在再次查找修改函數(shù)的時(shí)候,只要屬于該結(jié)構(gòu)的函數(shù)就進(jìn)行修改就好了,代碼如下:

聲明數(shù)據(jù)結(jié)構(gòu):
struct Time{
    int hour;
    int minute;
    int second;
    void set_time(int h, int m, int s); 
    void tick();
    void show();
    void run();
};
定義函數(shù):
void Time::set_time(int h, int m, int s){}
void Time::tick(){}
void Time::show(){}
void Time::run(){}

補(bǔ)充:成員運(yùn)算符:表示某個(gè)變量的成員,‘.’;表示某個(gè)類型的成員,“::”;

類的引出

   這樣定義就萬(wàn)事大吉了嗎?我們?nèi)绻谄渌瘮?shù)中試圖訪問(wèn)該結(jié)構(gòu)中的成員變量(如:hour、minute、second)是成功的,這樣我們就有可能無(wú)意中修改了數(shù)據(jù)結(jié)構(gòu)中的某個(gè)成員變量的值,當(dāng)其他函數(shù)在使用成員變量的時(shí)候,就會(huì)使用該可能非法的數(shù)據(jù),這樣我們就會(huì)想到只要讓這些成員變量變成私有的就好了,這樣除了結(jié)構(gòu)中定義的函數(shù)外,其他方式都不可以訪問(wèn)到該成員,這就出現(xiàn)了我們C++常使用的一種數(shù)據(jù)結(jié)構(gòu)——類。我們進(jìn)行如下修改。

聲明數(shù)據(jù)結(jié)構(gòu):
class Time{
    int hour;
    int minute;
    int second;
    void set_time(int h, int m, int s); 
    void tick();
    void show();
    void run();
};
定義函數(shù):
void Time::set_time(int h, int m, int s){}
void Time::tick(){}
void Time::show(){}
void Time::run(){}

如果我們就止步于上面的數(shù)據(jù)結(jié)構(gòu),我們定義一個(gè)上述類的對(duì)象,當(dāng)我們通過(guò)對(duì)象調(diào)用函數(shù)的時(shí)候,會(huì)發(fā)現(xiàn)編譯不會(huì)通過(guò),提示我們“你訪問(wèn)的對(duì)象是私有的”。這里就要說(shuō)明class和struct最大的區(qū)別:struct中的所有成員默認(rèn)是公開(kāi)的(public),即任意一個(gè)函數(shù)都可以進(jìn)行訪問(wèn);class中的所有成員默認(rèn)是私有的(private),即除了class中的成員函數(shù)之外,其他方式不可以訪問(wèn)。

我們使用class而不是用struct的原因是因?yàn)?,我們想讓成員變量變成私有的,實(shí)現(xiàn)基本數(shù)據(jù)封裝。但是對(duì)于成員函數(shù)的調(diào)用接口我們不必要私有,因?yàn)槲覀儎?chuàng)建的對(duì)象,要通過(guò)成員函數(shù)完成項(xiàng)目任務(wù),所以我們應(yīng)讓成員函數(shù)的接口公開(kāi)(public),這就是我們常說(shuō)的封裝。接著進(jìn)行如下更改,讓成員函數(shù)變量公有的(public)。

聲明數(shù)據(jù)結(jié)構(gòu):
class Time{
private:
    int hour;
    int minute;
    int second;
public:
    void set_time(int h, int m, int s); 
    void tick();
    void show();
    void run();
};
定義函數(shù):
void Time::set_time(int h, int m, int s){}
void Time::tick(){}
void Time::show(){}
void Time::run(){}

在這里我們要說(shuō)說(shuō)class中成員變量的訪問(wèn)權(quán)限:

(1)private:私有的。這是class中成員變量默認(rèn)的訪問(wèn)權(quán)限,這種權(quán)限的成員變量,只有該類中成員函數(shù)可以訪問(wèn),子類中的成員函數(shù)不可以訪問(wèn),其他方式也不可以訪問(wèn)。(子類是繼承中的概念,在講繼承的時(shí)候再談這個(gè)話題,先了解就好)。

(2)protected:保護(hù)的。該class中的成員函數(shù)可以訪問(wèn),子類中的成員函數(shù)也可以訪問(wèn),但是其他方式不可以訪問(wèn)。

(3)public:公開(kāi)的。該class中的成員函數(shù)可以訪問(wèn),子類中的成員函數(shù)也可以訪問(wèn),其他方式亦可以訪問(wèn)。

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

對(duì)于class中的成員函數(shù),我們可以自己寫(xiě)一個(gè)函數(shù)進(jìn)行初始化,比如set函數(shù),將每個(gè)成員變量進(jìn)行初始化賦值。但是每次創(chuàng)建一個(gè)新類都要調(diào)用該種函數(shù)進(jìn)行成員的初始化,這大大加大了我們創(chuàng)建使用類的代價(jià),為了讓我們每次創(chuàng)建一個(gè)對(duì)象的時(shí)候,都可以自動(dòng)調(diào)用某個(gè)函數(shù)進(jìn)行成員變量的初始化,我們可以使用類中重要的成員函數(shù)——構(gòu)造函數(shù)(構(gòu)造函數(shù)無(wú)返回值,并且函數(shù)名與類名一致),它可以在創(chuàng)建對(duì)象的時(shí)候自動(dòng)調(diào)用,根據(jù)創(chuàng)建對(duì)象時(shí)傳入的初始化參數(shù)進(jìn)行成員變量的初始化。

構(gòu)造函數(shù)的格式:Class_name(parameters){}

構(gòu)造函數(shù)的初始化有兩種方式:

(1)通過(guò)在構(gòu)造函數(shù)內(nèi)部進(jìn)行賦值進(jìn)行初始化,常量不能被賦值,只能使用初始化列表。

(2)通過(guò)初始化列表進(jìn)行初始化,如果成員變量是數(shù)組或結(jié)構(gòu)不能使用初始化列表進(jìn)行初始化。

構(gòu)造函數(shù)的重載:有時(shí)候我們需要定義多個(gè)構(gòu)造函數(shù),因?yàn)槲覀兛赡芑诓煌男枨髮?duì)成員變量的初始化操作不同,這就是構(gòu)造函數(shù)的重載(函數(shù)重載:函數(shù)名相同,但是函數(shù)參數(shù)不同。系統(tǒng)可以根據(jù)傳入?yún)?shù)的不同來(lái)調(diào)用不同的函數(shù))。

析構(gòu)函數(shù):存在構(gòu)造函數(shù)也就會(huì)存在析構(gòu)函數(shù),析構(gòu)函數(shù)就是在該對(duì)象即將被釋放的時(shí)候做收尾動(dòng)作,析構(gòu)函數(shù)一定沒(méi)有參數(shù)列表,所以析構(gòu)函數(shù)不可以重載。

  析構(gòu)函數(shù)規(guī)則:~Class_name(){}; 

class A{
     int n;
     double d;
 public :  A():n(0),d(0.0){   // constructor_init1
         }
         A(int n){        // constructor_init2
             this->n = n; 
             d = 0.0;           
         }
         void show(){
             cout << "n = " << n << ", d = " << d << endl;
         }
         ~A(){
            cout << “~A()” << endl;
         }
};
int main(int ac, char *av[])
{
    A a1;            // use constructor_init1
a1.show();
    A a2(100);        // use constructor_init2
    (*this).show();
    return 0;
}

   this指針:this指針是系統(tǒng)自動(dòng)定義的,用來(lái)保存結(jié)構(gòu)變量的地址。當(dāng)我們創(chuàng)建一個(gè)對(duì)象的時(shí)候,系統(tǒng)就會(huì)自動(dòng)將該對(duì)象對(duì)應(yīng)的類的成員保存在this中,我們可以通過(guò)this->mem_val或this->mem_func,來(lái)訪問(wèn)該成員。在一個(gè)成員函數(shù)中,可以不用寫(xiě)this,表示默認(rèn)使用該成員函數(shù)所在類的成員變量。

   構(gòu)造函數(shù)總結(jié):

   (1)構(gòu)造函數(shù)不同寫(xiě)返回值,其函數(shù)名與類名一致。

 (2)構(gòu)造函數(shù)在每個(gè)對(duì)象創(chuàng)建的時(shí)候都不被自動(dòng)調(diào)用一次。

 構(gòu)造函數(shù)的調(diào)用順序

    ·全局對(duì)象的構(gòu)造函數(shù)在main之前調(diào)用。

    ·靜態(tài)局部對(duì)象的構(gòu)造函數(shù)在整個(gè)程序的執(zhí)行過(guò)程中只調(diào)用一次。

class A{
   int n;
public:
   A(int n) : n(n){
         cout << "A(" << n << ')' <<  endl;
    }   
    ~A(){
        cout << "~A(" << n << ')' << endl;
    }   
};
void func(){
    A a2(2);
    static A a3(3);
}
int main(int ac, char *av[])
{
    A a4(4);
    cout << "first call func : \n";
    func();
    cout << "second call func : \n";
    func();
 
    return 0;
}
A a1(1); 
//==========================
// 1:全局對(duì)象
// 2:函數(shù)func中的自動(dòng)對(duì)象
// 3:函數(shù)func中的靜態(tài)全局對(duì)象
//4:函數(shù)main中的自動(dòng)對(duì)象
//===============================
結(jié)果顯示:
[root@anna-laptop construtor]# ./call_queue 
A(1)  
A(4)
first call func : 
A(2)
A(3)
~A(2)
second call func : 
A(2)
~A(2)
~A(4)
~A(3)
~A(1)

當(dāng)前名稱:從結(jié)構(gòu)struct談到類class(基于C++實(shí)現(xiàn))
轉(zhuǎn)載來(lái)源:http://jinyejixie.com/article6/jpdgig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、品牌網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣、App開(kāi)發(fā)、靜態(tài)網(wǎng)站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
磴口县| 馆陶县| 汤阴县| 沾益县| 应城市| 内黄县| 武安市| 合阳县| 华宁县| 土默特左旗| 靖远县| 枞阳县| 鄂温| 墨江| 平阴县| 伊宁市| 枞阳县| 鹤庆县| 共和县| 望都县| 泰来县| 松潘县| 永昌县| 高尔夫| 长子县| 巨鹿县| 南宫市| 洱源县| 贞丰县| 营山县| 平江县| 安吉县| 阿城市| 耿马| 包头市| 霍城县| 应用必备| 昭苏县| 施甸县| 通化市| 东莞市|