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對象