2020-02-15 C++核心編程04-基本框架

4.5.3遞增運算符重載

作用:通過重載遞增運算符历恐,實現(xiàn)自己的整形數(shù)據(jù)

1.前置++

2.后置++(重載時引入占位參數(shù)int躏率,用以告知編輯器為后置遞增)

總結(jié):前置遞增返回引用嫂沉,后置遞增返回值

示例:

//自定義整型

class MyInteger

{

friend ostream &operator <<(ostream &os, MyInteger myint);

public:

MyInteger()

{

m_Num = 0;

}

//重載前置++運算符

//返回引用是為了一直對一個數(shù)據(jù)進行遞增操作

MyInteger& operator++()

{

++m_Num;

return *this;

}

//重載后置++運算符

//int代表占位參數(shù)殴蓬,用于區(qū)分前置和后置遞增

//一定要返回值柏蘑,因為返回局部對象的引用是非法操作

//先返回庙曙,后++

MyInteger operator++(int )

{

MyInteger temp = *this;//記錄當前本身的值

++m_Num;

return temp;

}

private:

int m_Num;

};

ostream &operator <<(ostream &os, MyInteger myint)

{

os << myint.m_Num;

return os;

}

void test01()

{

MyInteger myint;

cout <<++myint << endl;

cout << myint << endl;

}

void test02()

{

MyInteger myint;

cout << myint++ << endl;

cout << myint << endl;

}

4.5.4賦值運算符重載

C++至少給一個類添加4個函數(shù):

1.默認構(gòu)造函數(shù)(無參空镜,函數(shù)體為空)

2.默認析構(gòu)函數(shù)(無參,函數(shù)體為空)

3.默認拷貝構(gòu)造函數(shù)捌朴,對屬性進行值拷貝吴攒;

4.賦值運算符operator=,對屬性進行值拷貝

如果類中有屬性指向堆區(qū)砂蔽,做賦值操作時也會出現(xiàn)深淺拷貝問題洼怔;

淺拷貝:堆區(qū)內(nèi)存重復釋放,程序崩潰左驾;

解決方案:利用深拷貝镣隶,解決淺拷貝帶來的問題;

示例:

class Person

{

public:

Person(int age)

{

m_Age = new int(age);

cout << "Person(int)" << endl;

}

//注意:返回的是引用诡右,才能返回對象自身

Person& operator=(const Person &p)

{

//m_Age = p.m_Age;//編譯器提供的淺拷貝

//應(yīng)該先判斷是否有屬性在堆區(qū)安岂,如果有,先釋放干凈

if (m_Age != NULL)

{

delete m_Age;

m_Age = NULL;

}

//然后再深拷貝

m_Age = new int(*p.m_Age);

return *this;

}

~Person()

{

if (m_Age != NULL)

{

delete m_Age;

m_Age = NULL;

}

cout << "~Person()" << endl;

}

//private:

int *m_Age;

};

4.5.5關(guān)系運算符重載

1.推薦:友元函數(shù)的形式重載

2.也可成員函數(shù)形式重載

4.5.6函數(shù)調(diào)用運算符重載

1.函數(shù)調(diào)用運算符()也可以重載帆吻;

2.由于重載后使用方式非常像函數(shù)調(diào)用嗜闻,因此稱為仿函數(shù);

3.仿函數(shù)沒有固定寫法桅锄,非常靈活;

補充:不想創(chuàng)建一個對象時样眠,可使用匿名函數(shù)對象友瘤;

示例:

//打印輸出類

class MyPrint

{

public:

void operator()(string test)

{

cout << test << endl;

}

};

//仿函數(shù)非常靈活,沒有固定寫法

class MyAdd

{

public:

int operator()(int a, int b)

{

return a + b;

}

};

void test01()

{

MyPrint myp;

myp("lalalala");//由于使用起來非常類似于函數(shù)調(diào)用檐束,因此稱為仿函數(shù)

}

void test02()

{

MyAdd myadd;

cout<<myadd(5, 9)<<endl;

//匿名函數(shù)對象

cout << MyAdd()(10, 10) << endl;

}

4.6繼承

4.6.1繼承基本語法

繼承時面向?qū)ο笕筇匦灾唬?/p>

利用繼承技術(shù)辫秧,可以減少重復代碼;

語法:class 子類(派生類) : 繼承方式? 父類(基類)

4.6.2繼承方式

共三種:

1.公共繼承

2.保護繼承

3.私有繼承


4.6.3繼承中的對象模型

如何使用工具查看vs中的對象模型:

利用開發(fā)人員命令提示工具查看對象模型

1.跳轉(zhuǎn)盤符? D:

2.跳轉(zhuǎn)文件路徑 cd ..具體路徑下

3.查看命令

cl /d1 reportSingleClassLayout 類名 文件名(.cpp)

示例:

class Base

{

public:

int m_A;

protected:

int m_B;

private:

int m_C;

};

class Son

:public Base

{

public:

int m_D;

};

void test01()

{

//父類中所有非靜態(tài)成員屬性都會被子類繼承下去

//父類中私有成員屬性 是被編譯器隱藏了

//因此是訪問不到被丧,但是確實被繼承下去了

cout << "sizeof(Son)=" << sizeof(Son) << endl;

}

注意:父類中的私有成員也被子類繼承了盟戏,只是訪問不到


4.6.4繼承中的構(gòu)造和析構(gòu)順序

先調(diào)用父類構(gòu)造函數(shù),再調(diào)用子類構(gòu)造函數(shù)甥桂;

析構(gòu)順序與構(gòu)造相反柿究;


4.6.5繼承同名成員處理方式

1.訪問子類同名成員,直接訪問即可黄选;

2.訪問父類同名成員蝇摸,需要加作用域婶肩;

示例:

class Base

{

public:

void func()

{

cout << "Base::func()" << endl;

}

void func(int a)

{

cout << "Base::func(int)" << endl;

}

};

class Son

:public Base

{

public:

void func()

{

cout << "Son::func()" << endl;

}

};

void test03()

{

Son s;

//如果子類中出現(xiàn)和父類同名的成員函數(shù)

//子類的同名成員會隱藏掉父類中所有同名成員函數(shù)

//“所有”是指只要函數(shù)名相同,哪怕參數(shù)不同

//如果想訪問到父類中被隱藏的同名成員函數(shù)貌夕,需要加作用域

//s.func(100);//error

s.Base::func(100);

}

總結(jié):

1.子類對象可以直接訪問到子類中的同名成員律歼;

2.子類對象加作用域可以訪問到父類同名成員;

3.當父類和子類擁有同名的成員函數(shù)啡专,子類會隱藏父類中同名成員函數(shù)险毁,加作用域可以訪問到父類中的同名成員函數(shù);


4.6.6繼承同名靜態(tài)成員處理方式

靜態(tài)成員和非靜態(tài)成員出現(xiàn)同名们童,處理方式一致畔况;

1.訪問子類同名成員,直接訪問即可病附;

2.訪問父類同名成員问窃,需要加作用域;

注意:靜態(tài)成員可以通過類名訪問完沪;

示例:

void test01()

? {

? //1.通過對象訪問

? /*Son s;

? cout << "Base::m_A=" << s.Base::m_A << endl;

? cout << "Son::m_A=" << s.m_A << endl;*/

? //2.通過類名訪問

? cout << "Base::m_A=" << Base::m_A << endl;

? cout << "Son::m_A=" << Son::m_A << endl;

? //第一個::代表通過類名方式訪問?

? //第二個::代表訪問父類作用域下

? cout << "Base::m_A=" << Son::Base::m_A << endl;

? }

? void test02()

? {

? //1.通過對象訪問

? Son s;

? s.func();

? s.Base::func();

? //2.通過類名訪問

? Son::func();

? Son::Base::func();

? }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末域庇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子覆积,更是在濱河造成了極大的恐慌听皿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宽档,死亡現(xiàn)場離奇詭異尉姨,居然都是意外死亡,警方通過查閱死者的電腦和手機吗冤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門又厉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椎瘟,你說我怎么就攤上這事覆致。” “怎么了肺蔚?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵煌妈,是天一觀的道長。 經(jīng)常有香客問我宣羊,道長璧诵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任仇冯,我火速辦了婚禮之宿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苛坚。我一直安慰自己澈缺,他們只是感情好坪创,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姐赡,像睡著了一般莱预。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上项滑,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天依沮,我揣著相機與錄音,去河邊找鬼枪狂。 笑死危喉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的州疾。 我是一名探鬼主播辜限,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼严蓖!你這毒婦竟也來了薄嫡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤颗胡,失蹤者是張志新(化名)和其女友劉穎毫深,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毒姨,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡哑蔫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弧呐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闸迷。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俘枫,靈堂內(nèi)的尸體忽然破棺而出腥沽,到底是詐尸還是另有隱情,我是刑警寧澤崩哩,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站言沐,受9級特大地震影響邓嘹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜险胰,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一汹押、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧起便,春花似錦棚贾、人聲如沸窖维。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铸史。三九已至,卻和暖如春怯伊,著一層夾襖步出監(jiān)牢的瞬間琳轿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工耿芹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留崭篡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓吧秕,卻偏偏與公主長得像琉闪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子砸彬,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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