Boolan C++筆記 一

C++面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming, OOP)


Object Based(基于對象)?

面對的是單一class的設(shè)計(jì)

-class without pointer members

-class with pointer memebers

Object Oriented(面向?qū)ο?

面對的是多重classes的設(shè)計(jì),classes 和 classes 之間的關(guān)系

-繼承(inheritance)

-復(fù)合(composition)

-委托(delegation)

C++ 的歷史

B語言(1969)

C語言(1972)

C++語言(1983)(newC ->C with Class -> C++)

Java語言

C#語言

C++ 演化

C++98(1.0) -> C++03(TR1,Technical Report1)-> ?C++11(2.0)-> C++14

C++包括C++語言和C++標(biāo)準(zhǔn)庫

C++ programs 代碼基本形式

.h(headerfiles):Classes ?Declaration(聲明) + .cpp + .h(Standard Library)

注:延伸文件名(extension file name) 不一定是.h或.cpp,也可能是.hpp 或其他也可能無延伸名比如#include<cmath>

防衛(wèi)式聲明:

#ifndef __XXX__

#define __XXX__

#endif

編譯器對頭文件的預(yù)處理

1、編譯器將處理掉所有注釋,以空格代替水泉;

2、刪除#define骗绕,展開所有宏定義诈胜;

3、處理?xiàng)l件編譯指令#if巧涧、#ifdef璃赡、#elif判哥、#else、#endif碉考;

4塌计、處理#include,展開被包含的頭文件(直接將頭文件復(fù)制進(jìn)文件)

5豆励、保留編譯器需要使用的#progma指令等等夺荒。

編譯器還會做很多其他事情瞒渠,但是從第四條可以看出,會將頭文件中寫的代碼直接復(fù)制進(jìn)文件技扼。那么可以想象伍玖,如果有多份頭文件均不進(jìn)行防衛(wèi)式聲明,均包含了類似這種內(nèi)容很多的頭文件剿吻,經(jīng)過預(yù)處理以后的文件窍箍,即便自己只寫了一行代碼cout,它包含的代碼量將是相當(dāng)?shù)凝嫶罄雎谩_@還不是最關(guān)鍵的問題椰棘,關(guān)鍵是頭文件中定義了一個(gè)變量,那么多次包含該頭文件之后榄笙,就會產(chǎn)生重復(fù)定義的問題邪狞。



以下關(guān)于inline來自百度百科

關(guān)于inline(內(nèi)聯(lián))函數(shù): C++關(guān)鍵字,在函數(shù)聲明或定義中函數(shù)返回類型前加上關(guān)鍵字inline茅撞,即可以把函數(shù)指定為內(nèi)聯(lián)函數(shù)帆卓。關(guān)鍵字inline必須與函數(shù)定義放在一起才能使函數(shù)成為內(nèi)聯(lián),僅僅將inline放在函數(shù)聲明前面不起任何作用米丘。inline是一種“用于實(shí)現(xiàn)的關(guān)鍵字”剑令,而不是一種“用于聲明的關(guān)鍵字”。一般的拄查,用戶可以閱讀函數(shù)的聲明吁津,但是看不到函數(shù)的定義。

背景

在C&C++

一堕扶、inline關(guān)鍵字用來定義一個(gè)類的內(nèi)聯(lián)函數(shù)碍脏,引入它的主要原因是用它替代C中表達(dá)式形式的宏定義

表達(dá)式形式的宏定義一例:

#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

取代這種形式的原因如下:

1. C中使用define這種形式宏定義的原因是因?yàn)樯运悖珻語言是一個(gè)效率很高的語言潮酒,這種宏定義在形式及使用上像一個(gè)函數(shù),但它使用預(yù)處理器實(shí)現(xiàn)邪蛔,沒有了參數(shù)壓棧,代碼生成等一系列的操作,因此扎狱,效率很高侧到,這是它在C中被使用的一個(gè)主要原因。

2. 這種宏定義在形式上類似于一個(gè)函數(shù)淤击,但在使用它時(shí)匠抗,僅僅只是做預(yù)處理器符號表中的簡單替換,因此它不能進(jìn)行參數(shù)有效性的檢測污抬,也就不能享受C++編譯器嚴(yán)格類型檢查的好處汞贸,另外它的返回值也不能被強(qiáng)制轉(zhuǎn)換為可轉(zhuǎn)換的合適的類型绳军,這樣,它的使用就存在著一系列的隱患和局限性矢腻。

3. 在C++中引入了類及類的訪問控制门驾,這樣,如果一個(gè)操作或者說一個(gè)表達(dá)式涉及到類的保護(hù)成員或私有成員多柑,你就不可能使用這種宏定義來實(shí)現(xiàn)(因?yàn)闊o法將this指針放在合適的位置)奶是。

4. inline 推出的目的,也正是為了取代這種表達(dá)式形式的宏定義竣灌,它消除了宏定義的缺點(diǎn)聂沙,同時(shí)又很好地繼承了宏定義的優(yōu)點(diǎn)。

此外還有一些規(guī)則需注意:

1初嘹、inline說明對編譯器來說只是一種建議及汉,編譯器可以選擇忽略這個(gè)建議。比如屯烦,你將一個(gè)長達(dá)1000多行的函數(shù)指定為inline坷随,編譯器就會忽略這個(gè)inline,將這個(gè)函數(shù)還原成普通函數(shù)漫贞。

2甸箱、在調(diào)用內(nèi)聯(lián)函數(shù)時(shí),要保證內(nèi)聯(lián)函數(shù)的定義讓編譯器"看"到迅脐,也就是說內(nèi)聯(lián)函數(shù)的定義要在頭文件中芍殖,這與通常的函數(shù)定義不一樣。但如果你習(xí)慣將函數(shù)定義放在CPP文件中谴蔑,或者想讓頭文件更簡潔一點(diǎn)豌骏,可這樣做:


以上方法是通用、有效的隐锭,可放心使用窃躲,不必?fù)?dān)心在頭文件包含CPP文件會導(dǎo)致編譯錯(cuò)誤。

一般的類的數(shù)據(jù)都會放在private里

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


利用初值列賦初值效率更高.

構(gòu)造函數(shù)可以有很多個(gè)-overloading(重載)

只要不是完全相同的函數(shù)(編譯器理解的完全相同)

單例模式下構(gòu)造函數(shù)放在private中


對不會做修改的加const修飾符

參數(shù)傳遞:pass by value / pass by reference (優(yōu)先)

返回值傳遞:return by value /return by reference(優(yōu)先)

C++中值傳遞钦睡、指針傳遞和引用傳遞

friend(友元)(百度百科)

友元可以是一個(gè)函數(shù)蒂窒,該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類荞怒,該類被稱為友元類洒琢。

我們已知道類具有封裝和信息隱藏的特性。只有類的成員函數(shù)才能訪問類的私有成員褐桌,程序中的其他函數(shù)是無法訪問私有成員的衰抑。非成員函數(shù)可以訪問類中的公有成員,但是如果將數(shù)據(jù)成員都定義為公有的荧嵌,這又破壞了隱藏的特性呛踊。另外砾淌,應(yīng)該看到在某些情況下,特別是在對某些成員函數(shù)多次調(diào)用時(shí)谭网,由于參數(shù)傳遞汪厨,類型檢查和安全性檢查等都需要時(shí)間開銷,而影響程序的運(yùn)行效率蜻底。

為了解決上述問題骄崩,提出一種使用友元的方案。友元是一種定義在類外部的普通函數(shù)或類薄辅,但它需要在類體內(nèi)進(jìn)行說明要拂,為了與該類的成員函數(shù)加以區(qū)別,在說明時(shí)前面加以關(guān)鍵字friend站楚。友元不是成員函數(shù)脱惰,但是它可以訪問類中的私有成員。友元的作用在于提高程序的運(yùn)行效率窿春,但是拉一,它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問類的私有成員旧乞。不過蔚润,類的訪問權(quán)限確實(shí)在某些應(yīng)用場合顯得有些呆板,從而容忍了友元這一特別語法現(xiàn)象尺栖。

作用及特點(diǎn)

友元提供了不同類的成員函數(shù)之間嫡纠、類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制。通過友元延赌,一個(gè)不同函數(shù)或另一個(gè)類中的成員函數(shù)可以訪問類中的私有成員和保護(hù)成員除盏。c++中的友元為封裝隱藏這堵不透明的墻開了一個(gè)小孔,外界可以通過這個(gè)小孔窺視內(nèi)部的秘密挫以。

友元的正確使用能提高程序的運(yùn)行效率者蠕,但同時(shí)也破壞了類的封裝性和數(shù)據(jù)的隱藏性,導(dǎo)致程序可維護(hù)性變差掐松。

關(guān)于操作符重載:

1 關(guān)鍵字operator

2 注意返回的是值還是引用

3 cout是變的不可以加const ? cout 是ostream對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踱侣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子大磺,更是在濱河造成了極大的恐慌泻仙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量没,死亡現(xiàn)場離奇詭異,居然都是意外死亡突想,警方通過查閱死者的電腦和手機(jī)殴蹄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門究抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袭灯,你說我怎么就攤上這事刺下。” “怎么了稽荧?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵橘茉,是天一觀的道長。 經(jīng)常有香客問我姨丈,道長畅卓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任蟋恬,我火速辦了婚禮翁潘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歼争。我一直安慰自己拜马,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布沐绒。 她就那樣靜靜地躺著俩莽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乔遮。 梳的紋絲不亂的頭發(fā)上扮超,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音申眼,去河邊找鬼瞒津。 笑死,一個(gè)胖子當(dāng)著我的面吹牛括尸,可吹牛的內(nèi)容都是我干的巷蚪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼濒翻,長吁一口氣:“原來是場噩夢啊……” “哼屁柏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起有送,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淌喻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后雀摘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裸删,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年阵赠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涯塔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肌稻。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匕荸,靈堂內(nèi)的尸體忽然破棺而出爹谭,到底是詐尸還是另有隱情,我是刑警寧澤榛搔,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布诺凡,位于F島的核電站,受9級特大地震影響践惑,放射性物質(zhì)發(fā)生泄漏腹泌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一童本、第九天 我趴在偏房一處隱蔽的房頂上張望真屯。 院中可真熱鬧,春花似錦穷娱、人聲如沸绑蔫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽配深。三九已至,卻和暖如春嫁盲,著一層夾襖步出監(jiān)牢的瞬間篓叶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工羞秤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缸托,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓瘾蛋,卻偏偏與公主長得像俐镐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子哺哼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,519評論 1 51
  • 1. 讓自己習(xí)慣C++ 條款01:視C++為一個(gè)語言聯(lián)邦 為了更好的理解C++佩抹,我們將C++分解為四個(gè)主要次語言:...
    Mr希靈閱讀 2,812評論 0 13
  • 1.面向?qū)ο蟮某绦蛟O(shè)計(jì)思想是什么? 答:把數(shù)據(jù)結(jié)構(gòu)和對數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的方法封裝形成一個(gè)個(gè)的對象取董。 2.什么是類棍苹?...
    少帥yangjie閱讀 5,006評論 0 14
  • 第一天 一.內(nèi)聯(lián)函數(shù)(inline) 函數(shù)調(diào)用的時(shí)候需要建立棧內(nèi)存環(huán)境,進(jìn)行參數(shù)傳遞茵汰,并產(chǎn)生程序執(zhí)行轉(zhuǎn)移枢里,這些工作...
    陳果123閱讀 1,127評論 0 1
  • 重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識點(diǎn);socket坡垫;unix梭灿;stl;boost等冰悠; C++ 教程 | 菜...
    kakukeme閱讀 19,912評論 0 50