成員函數(shù)旭寿、繼承(20170213)

C++06

區(qū)分new/delete malloc/free

new /delete 運算符芥映,不需要轉(zhuǎn)換,自動調(diào)用析構(gòu)函數(shù)

malloc /free 函數(shù)滚秩,返回值轉(zhuǎn)換专执,釋放空間

成員函數(shù)

在普通成員函數(shù)中,不管是否定義形參叔遂,系統(tǒng)都會自動加上一個隱藏的形參他炊,該形參類型為該類的指針類型,即( Score *)已艰。該指針的作用痊末,用來存放當前調(diào)用該成員函數(shù)對象的地址,一般將該指針稱之為this指針哩掺。

static成員函數(shù)

stastic 函數(shù)沒有this 指針

static函數(shù) 既可以通過類對象調(diào)用凿叠,也可以通過類名調(diào)用

static 函數(shù)中,不同訪問和操作普通成員變量嚼吞,只能訪問和操作靜態(tài)成員變量

一般將不需要訪問和操作普通成員變量函數(shù)盒件,但又和該類相關(guān)的函數(shù)聲明定義為static函數(shù),如果stastic成員變量舱禽,在類外定義炒刁,則返回值類型前不需要加stastic

#include <iostream>
using namespace std;
class Score
{
public:
    //在普通的成員函數(shù)中,不管有沒有定義形參
    //系統(tǒng)都會自動的加上一個隱藏的形參
    //該形參的類型為該類的指針類型--> (Score *)
    //該指針的作用:用來存放當前調(diào)用該成員函數(shù)對象的地址
    //一般將該指針稱之為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ù)既可以通過類對象調(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;
}

const成員函數(shù)

#include <iostream>
#include <math.h>
using namespace std;

class Point
{
public:
    Point(float x = 0.0f, float y = 0.0f)
    {
        m_x = x;
        m_y = y;
    }
    //getX(Point *this)
    float getX()
    {
        return m_x;
    }
    float getY()
    {
        return m_y;
    }

    //1,const成員函數(shù)有隱藏的this指針
    //2,由于成員函數(shù)申明const成員函數(shù)
    //  該this指針會轉(zhuǎn)變?yōu)? const Point *this
    //3,不能修改普通成員變量的值-->const Point *this
    //  但是可以修改static成員變量的值
    //4,一般將只訪問不涉及修改成員變量的函數(shù)
    //  申明為const成員函數(shù)翔始,以防意外修改了成員變量
    //5,const成員函數(shù)之只能被類對象調(diào)用
    void show() const
    {
        cout << '(' << m_x << ',' << m_y << ')' << endl;
        //this->m_x = 90;  //error
        m_iTestData = 999;
        cout << "m_iTestData=" << m_iTestData << endl;
    }


private:
    float m_x;
    float m_y;
    static int m_iTestData;
};

int Point::m_iTestData = 90;


int main(void)
{
    Point p1(2, 3);
    Point p2(5, 7);
    p1.show();  //-->Point::show(&p1);
    p2.show();

    //const point -> common point  //errror
    //common point -> const point  //right

    //const int a = 90;
    const Point p3(12, 34);
    p3.getX();// -->Point::getX(&p3);   

    return 0;
}

C++的繼承

單繼承

多繼承

虛繼承

class Teacher:virtual public Presion

派生類,會自動在類中添加一個指針里伯,通過指針訪問基類數(shù)據(jù)

在虛繼承情況下城瞎,由最派生類真正繼承被虛繼承的類

被虛繼承的類中的成員的初始化,由最派生類負責初始化

//單繼承
#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
//  繼承方式其實是對繼承過來的成員進行封裝
//2,若沒有指定繼承方式疾瓮,則默認為private繼承
//  class Teacher: Person-->class Teacher: private Person
//3,只有一個繼承,稱之為單繼承
//4,將被繼承的類稱之為基類
//5,新產(chǎn)成的類稱之為派生類
//6,派生類需要對繼承過來的數(shù)據(jù)和本身新增成員進行初始化
//7,對繼承過來的成員初始化方式:
//  在派生類構(gòu)造函數(shù)的初始化列表中脖镀,
//  顯式或者隱式的調(diào)用基類的構(gòu)造函數(shù)來對數(shù)據(jù)進行初始化
//  隱式的調(diào)用基類的構(gòu)造函數(shù):默認調(diào)用基類的無參構(gòu)造函數(shù)
//class Teacher: public Person
//class Teacher: protected Person
class Teacher: private Person
{
public:
#if 0
    //以下兩種情況:默認調(diào)用基類的無參構(gòu)造函數(shù)
    //              對繼承過來的數(shù)據(jù)進行初始化
    //即沒有在派生類的初始化列表中寫上基類的構(gòu)造函數(shù)
    //則默認調(diào)用基類的無參構(gòu)造函數(shù)對繼承過來的數(shù)據(jù)進行初始化
    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;
};

class Teacher: 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: 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
             << " 年級:" << m_strGrade << endl;
    }

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

int main(void)
{
    GraduateStudent gs("1001", "xhangsan", 19
                       , 'f', "beijing", 90
                       , 98, 78, "二年級"
                       , "c++", 9000, "研究生"
                       , "機器自主學習");
    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;
}
//虛擬繼承
#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;
};
//虛繼承,派生類會自動在類中添加一個指針
//通過該指針來訪問基類數(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
             << " 年級:" << m_strGrade << endl;
    }

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

//在虛繼承情況下蜒灰,由最派生類來真正繼承被虛繼承的類
//被虛繼承的類中的成員的初始化由最派生類負責
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, "二年級"
                       , "c++", 9000, "研究生"
                       , "機器自主學習");
    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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肩碟,隨后出現(xiàn)的幾起案子卷员,更是在濱河造成了極大的恐慌,老刑警劉巖腾务,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異削饵,居然都是意外死亡岩瘦,警方通過查閱死者的電腦和手機未巫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來启昧,“玉大人叙凡,你說我怎么就攤上這事∶苣” “怎么了握爷?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長严里。 經(jīng)常有香客問我新啼,道長,這世上最難降的妖魔是什么刹碾? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任燥撞,我火速辦了婚禮,結(jié)果婚禮上迷帜,老公的妹妹穿的比我還像新娘物舒。我一直安慰自己,他們只是感情好戏锹,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布冠胯。 她就那樣靜靜地躺著,像睡著了一般锦针。 火紅的嫁衣襯著肌膚如雪荠察。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天伞插,我揣著相機與錄音割粮,去河邊找鬼。 笑死媚污,一個胖子當著我的面吹牛舀瓢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耗美,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼京髓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了商架?” 一聲冷哼從身側(cè)響起堰怨,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛇摸,沒想到半個月后备图,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年揽涮,在試婚紗的時候發(fā)現(xiàn)自己被綠了抠藕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒋困,死狀恐怖盾似,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雪标,我是刑警寧澤零院,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站村刨,受9級特大地震影響告抄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烹困,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一玄妈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧髓梅,春花似錦拟蜻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奢方,卻和暖如春搔扁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟋字。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工稿蹲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹊奖。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓苛聘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忠聚。 傳聞我的和親對象是個殘疾皇子设哗,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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

  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out两蟀。 檢查...
    SeanC52111閱讀 2,778評論 0 3
  • 1. C++基礎(chǔ)知識點 1.1 有符號類型和無符號類型 當我們賦給無符號類型一個超出它表示范圍的值時网梢,結(jié)果是初始值...
    Mr希靈閱讀 17,980評論 3 82
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法赂毯,內(nèi)部類的語法战虏,繼承相關(guān)的語法拣宰,異常的語法,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • Introduction to C++ (Season 1) Unit 1: Overview of C++ 第1...
    我是阿喵醬閱讀 2,751評論 0 7
  • const 引用 const 引用是指向 const 對象的引用:const int ival = 1024;co...
    rogerwu1228閱讀 634評論 0 1