C++——this指針和繼承

在普通的成員函數(shù)中上渴,不管有沒有定義形參
系統(tǒng)都會(huì)自動(dòng)的加上一個(gè)隱藏的形參
該形參的類型為該類的指針類型-->(Score *)
該指針的作用:用來存放當(dāng)前調(diào)用該成員函數(shù)對(duì)象的地址
一般將該指針稱為this指針
Score::inScore(&s);
this->m_iNum;

特殊的成員函數(shù)

static
static 沒有 this 指針
static 既可以通過類對(duì)象調(diào)用,也可以通過類名調(diào)用
static 函數(shù)中不能訪問和操作普通的成員變量轮听,
只能訪問和操作靜態(tài)的成員變量
一般將不需要訪問和操作普通的成員變量的函數(shù)
但又和該類相關(guān)的函數(shù)申明定義為 static 成員函數(shù)
如果 static 成員變量在類外定義去团,則不需要加關(guān)鍵字 static

const
void show() const
有隱藏的 this 指針
由于成員函數(shù)聲明為 const 成員函數(shù)更振,
該 this 指針會(huì)轉(zhuǎn)變成為:const show *this
不能修改普通成員變量的值 -->const Show *this
但是可以修改靜態(tài)成員變量 static 的值
一般將只訪問不涉及修改成員變量的函數(shù)
申明為const成員函數(shù)宙帝,以防意外修改了成員變量
const成員函數(shù)只能被類對(duì)象調(diào)用

繼承

多繼承

虛繼承(選擇繼承,多級(jí)繼承可去重)
class Teacher: virtual public person
派生類會(huì)自動(dòng)在類中添加一個(gè)指針
通過該指針來訪問基類數(shù)據(jù)
由最派生類來真正繼承被虛繼承的類
被虛繼承的類中的成員的初始化由最派生類來負(fù)責(zé)

#include <iostream>
using namespace std;

class Score
{
public:
    //在普通的成員函數(shù)中捌锭,不管有沒有定義形參
    //系統(tǒng)都會(huì)自動(dòng)的加上一個(gè)隱藏的形參
    //該形參的類型為該類的指針類型--> (Score *)
    //該指針的作用:用來存放當(dāng)前調(diào)用該成員函數(shù)對(duì)象的地址
    //一般將該指針稱之為this指針
#if 0
    void inScore(Score *this)
    {
        cin >> this->m_iNum >> this->m_fMath 
            >> this->m_fEnglish >> this->m_fProgramming;
        this->m_fAvgScore = (this->m_fMath+this->m_fEnglish
                      +this->m_fProgramming)/3;
    }
#endif
    void inScore()
    {
        cin >> m_iNum >> m_fMath 
            >> m_fEnglish >> m_fProgramming;
        m_fAvgScore = (m_fMath+m_fEnglish
                      +m_fProgramming)/3;
    }
    void showScore()
    {
        cout << "id:" << m_iNum 
             << " score:" << m_fMath
             << ' ' << m_fEnglish 
             << ' ' << m_fProgramming 
             << " avgScore:" << m_fAvgScore << endl;
    }
    
    //1,static函數(shù)沒有this指針
    //2,static函數(shù)既可以通過類對(duì)象調(diào)用俘陷,
    //  也可以通過類名調(diào)用
    //3,static函數(shù)中不能訪問和操作普通的成員變量
    //  只能訪問和操作靜態(tài)的成員變量
    //4,一般將不需要訪問和操作普通的成員變量的函數(shù)
    //  但又和該類相關(guān)的函數(shù)申明定義為static成員函數(shù)
    //5,如果static成員變量在類外定義,則返回值類型前
    //  不需要加static關(guān)鍵字
    static void showHappy()
    {
        //cout << m_iNum << endl;
        cout << m_iTestData << endl;
        int iData = 90;
        cout << "iData=" << iData << endl;
        cout << "I am no.1, hahahahaha..." << endl;
    }
    static Score &getInstance();
private:
    int m_iNum;
    float m_fMath;
    float m_fEnglish;
    float m_fProgramming;
    float m_fAvgScore;
    static int m_iTestData; 
};

Score& Score::getInstance()
{
    static Score s;
    return s;
}

int Score::m_iTestData = 19999;

int main(void)
{
    Score s;
    Score s2;

    s.showHappy();
    Score::showHappy();

    Score &ref = Score::getInstance();

    return 0;
}
#include <iostream>
#include <string>
using namespace std;

class Person
{
public:
    Person(){cout << "Person()...\n";}
    Person(string id, string name
           , int age, char sex, string addr)
    {
        m_strId = id;
        m_strName = name;
        m_iAge = age;
        m_cSex = sex;
        m_strAddress = addr;
        cout << "Person(paragms..)...\n";
    }
    void info() const
    {
        cout << m_strId << ' ' << m_strName
             << ' ' << m_iAge << ' ' << m_cSex
             << ' ' << m_strAddress << endl;
    }
private:
    string m_strId;
    string m_strName;
    int m_iAge;
    char m_cSex;
    string m_strAddress;
};

//1,繼承方式:public,protected,private
//  繼承方式其實(shí)是對(duì)繼承過來的成員進(jìn)行封裝
//2,若沒有指定繼承方式,則默認(rèn)為private繼承
//  class Teacher: Person-->class Teacher: private Person
//3,只有一個(gè)繼承,稱之為單繼承
//4,將被繼承的類稱之為基類
//5,新產(chǎn)成的類稱之為派生類
//6,派生類需要對(duì)繼承過來的數(shù)據(jù)和本身新增成員進(jìn)行初始化
//7,對(duì)繼承過來的成員初始化方式:
//  在派生類構(gòu)造函數(shù)的初始化列表中观谦,
//  顯式或者隱式的調(diào)用基類的構(gòu)造函數(shù)來對(duì)數(shù)據(jù)進(jìn)行初始化
//  隱式的調(diào)用基類的構(gòu)造函數(shù):默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
class Teacher: public Person
{
public:
#if 0
    //以下兩種情況:默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
    //              對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
    //即沒有在派生類的初始化列表中寫上基類的構(gòu)造函數(shù)
    //則默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
    Teacher(){cout << "Teacher()...\n";}
    Teacher(string courseName, float salary)
    {
        cout << "Teacher(paramgms..)...\n";
    }
#endif
    //Teacher(): Person()
    Teacher(): Person("000", "newperson", 0, 'm', "china")
    {
        cout << "Teacher()...\n";
    }
    //Teacher(string courseName, float salary):Person()
    Teacher(string id, string name
            , int age, char sex, string addr
            , string courseName, float salary)
        : Person(id, name, age, sex, addr)
    {
        m_strCourseName = courseName;
        m_fSalary = salary;
        cout << "Teacher(paramgms..)...\n";
    }

    void info()
    {
        Person::info();
        cout << m_strCourseName << ' ' << m_fSalary << endl;
    }

private:
    string m_strCourseName;
    float m_fSalary;
};

int main(void)
{
#if 0
    Person p("1001", "zhangsan", 18, 'f', "shanghai");
    p.info();

#endif
    //Teacher tec;
    //Teacher tec2("chinese", 9000);
    Teacher tec("1001", "xiaohua", 28, 'f', "nanhai"
                , "english", 9000);
    tec.info();

    return 0;
}
#include <iostream>
#include <string>
using namespace std;

class Person
{
public:
    Person(){cout << "Person()...\n";}
    Person(string id, string name
           , int age, char sex, string addr)
    {
        m_strId = id;
        m_strName = name;
        m_iAge = age;
        m_cSex = sex;
        m_strAddress = addr;
        m_strFace = "cool";
        cout << "Person(paragms..)...\n";
    }
    void info() const
    {
        cout << m_strId << ' ' << m_strName
             << ' ' << m_iAge << ' ' << m_cSex
             << ' ' << m_strAddress << endl;
    }
    string m_strFace;
private:
    string m_strId;
    string m_strName;
    int m_iAge;
    char m_cSex;
    string m_strAddress;
};

//1,繼承方式:public,protected,private
//  繼承方式其實(shí)是對(duì)繼承過來的成員進(jìn)行封裝
//2,若沒有指定繼承方式拉盾,則默認(rèn)為private繼承
//  class Teacher: Person-->class Teacher: private Person
//3,只有一個(gè)繼承,稱之為單繼承
//4,將被繼承的類稱之為基類
//5,新產(chǎn)成的類稱之為派生類
//6,派生類需要對(duì)繼承過來的數(shù)據(jù)和本身新增成員進(jìn)行初始化
//7,對(duì)繼承過來的成員初始化方式:
//  在派生類構(gòu)造函數(shù)的初始化列表中,
//  顯式或者隱式的調(diào)用基類的構(gòu)造函數(shù)來對(duì)數(shù)據(jù)進(jìn)行初始化
//  隱式的調(diào)用基類的構(gòu)造函數(shù):默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
//class Teacher: public Person
//class Teacher: protected Person
class Teacher: private Person
{
public:
#if 0
    //以下兩種情況:默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
    //              對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
    //即沒有在派生類的初始化列表中寫上基類的構(gòu)造函數(shù)
    //則默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
    Teacher(){cout << "Teacher()...\n";}
    Teacher(string courseName, float salary)
    {
        cout << "Teacher(paramgms..)...\n";
    }
#endif
    //Teacher(): Person()
    Teacher(): Person("000", "newperson", 0, 'm', "china")
    {
        cout << "Teacher()...\n";
    }
    //Teacher(string courseName, float salary):Person()
    Teacher(string id, string name
            , int age, char sex, string addr
            , string courseName, float salary)
        : Person(id, name, age, sex, addr)
    {
        m_strCourseName = courseName;
        m_fSalary = salary;
        cout << "Teacher(paramgms..)...\n";
    }

    void info()
    {
        Person::info();
        cout << m_strCourseName << ' ' << m_fSalary << endl;
        cout << m_strFace << endl;
        //cout << m_strName << endl;
    }

private:
    string m_strCourseName;
    float m_fSalary;
};
//class Test:public Person;
int main(void)
{
    Teacher tec("1001", "xiaohua", 28, 'f', "nanhai"
                , "english", 9000);
    tec.info();

//  cout << tec.m_strFace << endl;

    return 0;
}
//多繼承
#include <iostream>
#include <string>
using namespace std;

class Person
{
public:
    Person(){cout << "Person()...\n";}
    Person(string id, string name
           , int age, char sex, string addr)
    {
        m_strId = id;
        m_strName = name;
        m_iAge = age;
        m_cSex = sex;
        m_strAddress = addr;
        cout << "Person(paragms..)...\n";
    }
    void info() const
    {
        cout << m_strId << ' ' << m_strName
             << ' ' << m_iAge << ' ' << m_cSex
             << ' ' << m_strAddress << endl;
    }
private:
    string m_strId;
    string m_strName;
    int m_iAge;
    char m_cSex;
    string m_strAddress;
};
//虛繼承,派生類會(huì)自動(dòng)在類中添加一個(gè)指針
//通過該指針來訪問基類數(shù)據(jù)
class Teacher: virtual public Person
{
public:
    Teacher()
    {
        cout << "Teacher()...\n";
    }
    //Teacher(string courseName, float salary):Person()
    Teacher(string id, string name
            , int age, char sex, string addr
            , string courseName, float salary)
        : Person(id, name, age, sex, addr)
    {
        m_strCourseName = courseName;
        m_fSalary = salary;
        cout << "Teacher(paramgms..)...\n";
    }

    void info() const
    {
        Person::info();
        cout << m_strCourseName << ' ' << m_fSalary << endl;
    }

private:
    string m_strCourseName;
    float m_fSalary;
};

class Student: virtual public Person
{
public:
    Student()
    {
    }
    Student(string id, string name
            , int age, char sex, string addr
            , float math, float chinese
            , float english, string grade)
        : Person(id, name, age, sex, addr)
    {
        m_fMath = math;
        m_fChinese = chinese;
        m_fEnglish = english;
        m_strGrade = grade;
        cout << "Student(paragms..)...\n";
    }

    void info() const
    {
        Person::info();
        cout << "score: " << m_fMath 
             << ' ' << m_fChinese
             << ' ' << m_fEnglish
             << " 年級(jí):" << m_strGrade << endl;
    }

private:
    float m_fMath;
    float m_fChinese;
    float m_fEnglish;
    string m_strGrade;
};
//多繼承情況時(shí),基類構(gòu)造函數(shù)的調(diào)用順序和繼承順序保持一致
//和在初始化列表中的前后順序無關(guān)

//在虛繼承情況下构挤,由最派生類來真正繼承被虛繼承的類
//被虛繼承的類中的成員的初始化由最派生類負(fù)責(zé)
class GraduateStudent: public Teacher, public Student
{
public:
    GraduateStudent(){}
    GraduateStudent(string id, string name
                    , int age, char sex, string addr
                    , float math, float chinese
                    , float english, string grade
                    , string courseName, float salary
                    , string level, string project)
        : Student(id, name, age, sex, addr
                  , math, chinese, english, grade)
          , Teacher(id, name, age, sex, addr
                    , courseName, salary)
          , Person(id, name, age, sex, addr)
    {
        m_strLevel = level;
        m_strProject = project;
        cout << "GraduateStudent(params...)\n";
    }
    void info() const
    {
        Student::info();
        Teacher::info();
            cout << m_strLevel << ' ' << m_strProject << endl;
    }
private:
    string m_strLevel;
    string m_strProject;
};

//person由Test真正繼承
class Test: public GraduateStudent
{};

int main(void)
{
    GraduateStudent gs("1001", "xhangsan", 19
                       , 'f', "beijing", 90
                       , 98, 78, "二年級(jí)"
                       , "c++", 9000, "研究生"
                       , "機(jī)器自主學(xué)習(xí)");
    gs.info();
    cout << "person size:" << sizeof(Person) << endl;
    cout << "student size:" << sizeof(Student) << endl;
    cout << "teacher size:" << sizeof(Teacher) << endl;
    cout << "graduate size:" << sizeof(GraduateStudent) << endl;

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艺晴,更是在濱河造成了極大的恐慌,老刑警劉巖囚巴,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件况脆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡根悼,警方通過查閱死者的電腦和手機(jī)凶异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挤巡,“玉大人剩彬,你說我怎么就攤上這事】蟊埃” “怎么了喉恋?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長母廷。 經(jīng)常有香客問我轻黑,道長,這世上最難降的妖魔是什么琴昆? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任氓鄙,我火速辦了婚禮,結(jié)果婚禮上业舍,老公的妹妹穿的比我還像新娘抖拦。我一直安慰自己升酣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布态罪。 她就那樣靜靜地躺著噩茄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪向臀。 梳的紋絲不亂的頭發(fā)上巢墅,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音券膀,去河邊找鬼君纫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芹彬,可吹牛的內(nèi)容都是我干的蓄髓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舒帮,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼会喝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玩郊,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肢执,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后译红,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體预茄,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年侦厚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耻陕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刨沦,死狀恐怖诗宣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情想诅,我是刑警寧澤召庞,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站来破,受9級(jí)特大地震影響裁眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讳癌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一穿稳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晌坤,春花似錦逢艘、人聲如沸旦袋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疤孕。三九已至,卻和暖如春央拖,著一層夾襖步出監(jiān)牢的瞬間祭阀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工鲜戒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留专控,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓遏餐,卻偏偏與公主長得像伦腐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子失都,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,523評(píng)論 1 51
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束柏蘑,并將收入和稅金輸出到文件tax. out。 檢查...
    SeanC52111閱讀 2,799評(píng)論 0 3
  • 重新系統(tǒng)學(xué)習(xí)下C++粹庞;但是還是少了好多知識(shí)點(diǎn)咳焚;socket;unix庞溜;stl黔攒;boost等; C++ 教程 | 菜...
    kakukeme閱讀 19,941評(píng)論 0 50
  • 1. 結(jié)構(gòu)體和共同體的區(qū)別强缘。 定義: 結(jié)構(gòu)體struct:把不同類型的數(shù)據(jù)組合成一個(gè)整體,自定義類型不傅。共同體uni...
    breakfy閱讀 2,130評(píng)論 0 22
  • 1.在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù)旅掂,為什么要加extern “C”? 答:首先访娶,extern是C/C...
    曾令偉閱讀 919評(píng)論 0 4