C++筆記

1.引用傳遞,

void swap(int &a,int &b){

int c=a;

a=b;

b=c;

}

int x=5,y=6;

swap(x,y);

 

2,構造函數需要有實現方法,傳入參數與類成員變量,

構造方法的初始化列表格式:

Test(int chour,int cminute,int csecond):hour(chour),minute(cminute),second(csecond){};

有參構造函數實例化

Test test(a,b,c);

 

3. 爲指針分配內存

    ptr = new int;

 

4,當創建類的對象時,如果這個類具有 內嵌對象成員,那麼各個內嵌對象首先要被自動創建,在創建對象時既要對本類的基本類型數據成員進行初始化,又要對內嵌對象成員 進行初始化,例子如下:

 

5,靜態成員函數可以直接訪問該類的靜態數據和靜態函數成員,而訪問非靜態成員,必須通過對象名,靜態數據成員,需要在類定義外再加以定義,以這種方式爲它分配空間,非靜態數據成員無需這樣,因爲他們的空間與對象的空間同時分配,

 

6,友元函數是在類中用關鍵字friend修飾的非成員函數,在它的函數體中可以通過對象名訪問類的私有成員和保護成員,

 

7,若A類爲B類的友元類,則A類的所有的成員函數都是B類的友元函數,都可以訪問B類的私有和保護成員,

友元函數不能傳遞

友元函數是單向的,我可以用你的,你不能用我的

友元函數是不被繼承的

 

8,常對象必須進行初始化,而且不能被修改 const A a(3,4) 。

如果將一個對象聲明爲常對象,則通過該常對象只能調用它的常成員函數,這是常對象對外的唯一接口。

無論是否通過常對象調用常成員函數,在常成員函數調用期間,目的對象都被視作常對象,因此常對象不能更新目的對象的數據成員,也不能針對目的對象調用該類中沒有用const修飾的成員函數。

Const可以對重載進行區分。

對於無需改變對象狀態的成員函數,都應當使用const。

常數據成員只能通過初始化列表來獲取初值。

常引用所引用數據不能被更新,如果常引用做形參,便不會意外地對實參進行更改,確保原數據的安全,只用不改。

 

9.外部變量用extern修飾,外部函數可用可不用,通常情況下,變量和函數的定義都是放在源文件中,而對於外部變量和外部函數的引用性申明則放在頭文件中,

 

10.條件編譯(#ifndef,#define,#endif),解決頭文件重複編譯

11.數組元素在內存中是順序,連續存儲的,邏輯上相鄰的地址在物理地址上也是相鄰的,使用數組名傳遞參數時,傳遞的是地址

 

12.內存空間不是你分配了纔可以使用,只是你分配了之後使用才安全, 不初始化的指針是個野指針,強指針變量置空,初始化爲NULL,使它不指向任何內容,要記得初始化就對了

(NULL是一個在很多頭文件中都有定義的宏,被定義爲0,所以不確定初值的指針也可以爲它指定爲0)

指向常量的指針:const int*p1=&a;此時不能通過指針來改變對象的值,但指針本身是可以改變的,可以指向另外的對象,使用指向常量的指針,可以確保指針所知指向的變量不被意外更改,如果使用一般的指針,編譯器不能確保指針所指的對象不被更改,但如果該變量本身不是常量,可以通過變量名自行更改變量值。

指針類型爲常量:int *const p1=&a;指針本身爲常量,只能指向一個固定的地址,不過該地址內的數據可以變。Void類型的指針:可以存儲任何類型的對象地址,任何類型的指針都可以賦值給void類型的指針變量,使用顯示轉換,通過void類型的指針可以訪問任何類型的數據,一般只在指針所指向類型不確定的情況下使用。

 

13.指針作爲函數參數:

指針作爲函數的返回值:當一個函數返回值是指針的時候,這個函數就是指針函數,使用指針函數最主要的目的就是要在函數結束時把大量的數據從被調用的函數返回到主調函數中。

 

指向函數的指針:

指向對象的指針:使用前一定要初始化

爲向前引用提供瞭解決方法

This指針

this指針實際上是類成員函數的一個隱含的參數,在調用類的成員函數時,目的對象的地址會自動作爲該參數的值,傳遞給被調用的成員函數,這樣被調函數就能夠通過this指針來訪問目的對象的數據成員。對於常成員來說,這個隱含的參數時常指針類型的。

指向類型爲非靜態成員的指針

Int(Point::*funcPtr)() const=&Point::getX;

指向類的靜態成員的指針

對類的靜態成員的訪問時不依賴對象的,因此可以用普通的指針來訪問靜態成員。

 

14.動態分配內存

建立和刪除對象使用new 和 delete(切記要釋放內存)。

例:int *point=new int(2)  (動態分配了用於存放int類型數據的空間,並將初值2存入該空間中,然後將首地址賦給point) 動態申請類的實例化對象空間如下:

New動態創建一維數組的形式:int *p=new [10] ();

如果是用new建立的數組內存,用delete刪除時在指針名前要加[ ]:   delete [] 指針名

 

 

15.vector是一個被封裝的數組類模板,例:vector<int>arr(10,6) (聲明瞭一個元素類型爲int ,數組大小爲10,元素初始化值爲6的數組)  注意需要引入#include<vector>頭文件,對元素的引用和普通數組相同,vector中的成員函數size()可以返回該數組的大小,vector數組名就是一個數組對象,而非首地址。

 

16.字符串表示方法:

 

 

 

String對象的構造方法:

string 是basic_string 類模板的一個實例化例子;

 

17.引用和指針的區別:

引用本身所佔用的內存空間中,存儲的就是被引用變量的地址,這和指針變量所存儲的內容有相同的性質。指針是一種底層的機制,引用則是一種較高的層的計值,在語言概念上它是另一變量的別名,而這可以說是殊途同歸,主要差異是在語言形式上,最後都是靠內存地址來實現的,普通指針可以多次被賦值,也就是可以多次更改它所指向的對象,但引用只能在它初始化的時候指定被引用的對象,其後就不能更改。

 

18.一個派生類可以同時繼承多個基類,即多繼承。

直接基類,間接基類。

類的繼承方式規定了如何訪問從基類繼承的成員,派生成員是指除了從基類繼承來的所有成員以外,新增的數據和成員。

 

19繼承的三大步:

1.吸收基類成員:

派生類包含了基類中除構造函數和析構函數以外的所有成員,繼承的訪問控制方式如下:

公有繼承:

基類的公有成員和保護成員的訪問屬性在派生類中不變,而基類的私有成員不可直接訪問(即無論是派生類的成員還是派生類的對象都無法直接訪問)

私有繼承:

當類的繼承方式爲私有繼承時,基類中的公有成員和保護成員都以私有成員的身份出現在派生類中,而基類的私有成員在派生類中不可直接訪問。

保護成員:

基類的共有成員和保護成員都以保護成員的身份出現在派生類中,而基類的私有成員不可直接訪問

類型兼容規則:

可以使用共有派生類的對象來代替基類對象,在代替之後,派生類對象就可以作爲基類的對象使用,但只能使用從基類繼承的成員。

  1. 派生類對象可以隱式轉換爲基類對象,即用派生類對象中從基類繼承來的成員,諸葛賦值給基類對象的成員
  2. 派生類的對象也可以初始化基類對象的引用。
  3. 派生類對象的地址也可以隱含轉化爲指向基類的指針。

 

20.派生類的構造函數:

構造派生類的對象時,就要對基類的成員對象和新增成員對象進行初始化,如果對基類初始化時,許喲啊調用基類的帶有形參的構造函數時,派生類就必須聲明構造函數

 

21.作用域分辨符:

21.虛基類:將共同基類設置爲虛基類,這時從不同的路徑繼承過來的同名數據成員的內存中就只有一個副本,同一個函數也只有一個映射

構造一個類的對象的一般順序是:

  1. 如果該類有直接或者間接的虛基類,則先執行虛基類的構造函數。
  2. 如果該類有其他的基類,則按照它們在繼承聲明列表中出現的次序,分別執行它們的構造函數,但構造過程中,不在執行它們的虛基類的構造函數。
  3. 按照在類的定義中出現的順序,對派生類中新增的成員對象進行初始化。對於類類型的成員對象,如果出現在構造函數初始化列表中,則以其中指定的參數執行構造函數,如未出現,則執行默認構造函數;對於基本數據類型的成員對象,如果出現在構造函數的初始化列表中,則使用其中指定的值爲其賦值,否則什麼也不做。
  4. 執行構造函數的函數體。

22.多態性:

多態的實現分類:編譯時的多態和運行時的多態

1.重載多態

.函數的重載:具有相同的函數名,但是形參的個數或者類型不同,如果函數名和形參類型都相同,即使返回值相同,也會被編譯器認定爲語法錯誤(函數重定義)

.運算符重載:對已有的運算符賦予多重含義,時同一個運算符作用於不同的數據類型時導致不同的行爲。

2.強制多態

3.包含多態

4.參數多態

 

23.類模板:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章