C 再度學習之筆記一

2021-06-25 08:00:18 字數 3343 閱讀 7089

c++再度學習之筆記一

時間過得真快啊,不知不覺又是一季。。。。。。。。

只剩下了在時光中蹉跎的自己,由於工作之中要用到c++,秉著對曾經學過的知識再度查缺補漏吧,對於筆記順序有點混亂,我只能說這只是筆記,不是教材。

希望。。。能有些作用吧。。。。

話不多說~直接進入主題!

1、類 (1)類的作用域:

(2)建構函式:

建構函式分兩個階段執行:(1)初始化階段(2)普通的計算階段。

注:不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化,

初始化發生在計算階段開始之前

建構函式初始化列表:以乙個冒號開始,接著是乙個以逗號分隔的資料成員列表,

每個資料成員後面跟乙個放在圓括號中的初始化式。建構函式初始化式只在函式的定義中

而不是宣告中指定。

注:初始化const物件或者引用型別的物件唯一機會是在初始化列表

(3)this指標:

以下情況必須用this:

(a)、防止命名衝突

class a

}(b)、將物件本身的指標或者引用給別的函式時

return this;  // 返回物件本身的指標

return *this;  // 返回物件本身的引用

三個新特徵:友元、可變成員、靜態成員。

(1)、友元

允許不是那個類的成員但是可以訪問它的非公有成員。

如:class s

友元宣告與作用域:友元宣告將已經命名的類或非成員函式引入到外圍作用域中。此外,

友元函式可以在類的內部定義,該函式的作用域擴充套件到包圍該類定義的作用域。

如:class s

//...rest of class s

}(2)靜態成員

使用類的static成員的三個優點:

<1>、static成員的名字是在類的作用域中,因此可以避免與其他類的成員或者全域性物件名字衝突

<2>、可以實施封裝

<3>、static成員是與特定類關聯的

但我們在類的外部定義static成員的時候,無須重複指定static保留字,該保留字只在類的內部宣告處

static函式沒有this指標,static成員是類的組成部分但不是任何物件的組成部分,因此,static成員

函式沒有this指標。

2、定義與宣告

宣告是將乙個名稱引入程式。定義提供了乙個實體在程式中的唯一描述。

宣告和定義有時是同時存在的。

只有當extern中不存在初始化式是才是宣告。其他情況既是定義也是宣告。

但是在下列情況下,宣告僅僅是宣告:

1:僅僅提供函式原型。如void func(int,int);

2: extern int a;

3:class a;

4:typedef宣告

5:在類中定義的靜態資料成員的宣告

下列情況下 ,定義僅僅是定義:

1:在類定義之外,定義並初始化乙個靜態資料成員。如 a::a=0;

2:在類外定義非內聯成員函式。

宣告僅僅是將乙個符號引入到乙個作用域。而定義提供了乙個實體在程式中的唯一描述。

在乙個給定的定義域中重複宣告乙個符號是可以的,但是卻不能重複定義,否則將會引起編譯錯誤。

但是在類中的成員函式和靜態資料成員卻是例外,雖然在類內它們都是宣告,但是也不能有多個。

在乙個給定的定義域中重複宣告乙個符號是可以的,但是卻不能重複定義,否則將會引起編譯錯誤。

3、複製控制

(1)複製建構函式、析構函式、賦值操作符

複製建構函式:形參與返回值。。。

禁止複製:為了防止複製,類必須顯示的宣告其複製建構函式為private,

然而類的友元和成員人可以進行複製,如果想要連友元和成員中的複製也禁止,

就得宣告乙個private複製建構函式但不對其定義。

(2)智慧型指標

我們定義乙個簡單類,類裡面有指標,對進行類物件賦值操作後,對於該指標指向物件作出改變

都將作用於共享物件,如果刪除其中乙個物件,則類就會產生乙個懸空指標,指向乙個不存在的對像。

解決方方法是定義所謂的智慧型指標。

1)、使用計數

2)、計數類

3)、計數類的使用

4)、賦值與改變

5)、舉例

原:class a

~a()

};class b

~b()

private:

a*a;

int flag;

};int* p=new int (10);

b* b1=new b(p,1);

b* b2=new b(p,2);

delete b1;//error,a類出現懸空指標

改正:class a

~a()

};class b

//copy membersand increment the use count

b(const b&b):a(b.a),flag(b.flag)

b& operator=(const b&bb)

//if use count goes to 0,delete the a object

~b()

private:

a* a;

int flag;

};int* p=new int (10);

b* b1=new b(p,1);

b* b2=new b(p,2);

delete b1;

其中b的建構函式之中可以將new a(p)更改為&a,a是a物件。但是此處目的不是在此,

故不討論。。。

不引起指標問題麼?感覺有點玄。。。似乎還有一點沒想通。。。還有就是為何在a類析構函式中

要使用delete

4、物件導向與泛型程式設計

1)、繼承,多型

派生類可以繼承基類定義的成員並且可以無須改變的使用那些與派生型別具體特性不相關的操作。

c++中基類希望派生類重新定義的函式會標誌為virtual函式(虛函式),希望繼承的不能被定義為虛函式。

虛函式的呼叫是執行時確定,非虛函式的呼叫是編譯時確定,virtual關鍵字只在類宣告中出現,不能在類定義體

之外出現

公有,私有,受保護繼承

公有:基類成員在派生類中保持自己的訪問級別

私有:基類的所有成員在派生類中為(private)私有成員

受保護:基類的所有成員在派生類中為受保護(protected)成員

2)、動態繫結

c++中通過基類的引用(或指標)呼叫虛函式的時候,將發生動態繫結。

相關引用(或指標)既可以指向基類物件也可以指向派生類物件,這就是所謂動態繫結的關鍵,但是

由於是在執行時確定的,所以被呼叫的具體函式是由實際呼叫的物件型別所決定的。

2014之C 學習筆記(一)

已經有很長一段時間沒有寫部落格了,可能大家已經淡忘了etwo這個人的存在,這一年多以來,本人從事了as的相關開發工作,但最近一段時間,as在 的沒落,相信有很多碼農也都清楚,現在的頁遊基本上達到飽和,手機上的遊戲基本被unity3d與cocos佔據,as基本沒有容身之處。so。最近我並不打算直接轉型...

開始系統的學習C 之 C 學習筆記《一》

丟了那麼久,總算開始有時間來學習c 了,多少次隨意學學,最終未能完整的學下來,每次都是淺嘗輒止。現在工作也不算太忙,荒廢的時間也不少了,離開學到日子也月來越近了,該收收心學習提高自己了。兩年的時間,出去上課的時間,能夠利用的真的不多。重新開始,真的要好好把握了,無論是以後做嵌入式,做影象,抑或是能夠...

C語言學習筆記之陣列(一)

陣列是一組有序資料的集合,陣列依靠陣列名和下標來唯一確定陣列中的元素,陣列中的每乙個元素都屬於同一種資料型別。在理解陣列之前回憶一下變數的定義過程,比如定義整型資料,int a 在執行到這句話的時候,在記憶體裡分配乙個4個位元組大小的記憶體空間用來存放資料,而陣列便是開闢一段連續的空間來存放一組資料...