C C 學習 第一章 類

2021-04-12 11:54:39 字數 3498 閱讀 3275

第一章 類

結構和類既相似又有區別:

在 c中,結構不能定義成員函式;而在c++中,結構可以定義成員函式。

在 c++中,結構和類的不同點是:預設狀態下,類成員是私有的,而結構成員是公有的;相同點在於:兩個結構變數或類物件可以相互賦值,也可以對結構變數或類物件逐個成員進行賦值。

1.1類成員函式

定義類成員函式的方法:

<1>內聯函式定義。

內聯函式的定義方式有兩種,隱式定義(在類宣告中實現函式,不使用

內聯函式的基本思想在於將每個函式呼叫用它的**體來替換。一方面,如果內聯函式體比較長,將增加類定義的規模和複雜性,很可能會增加整個目標**的體積,成員函式的**不能被該類所有的物件共享,系統要為每個物件建立乙份拷貝,浪費了記憶體空間;另一方面,如果內聯函式體非常短,編譯器為這個函式體生成的**就會真的比為函式呼叫生成的**要小許多,內聯這個函式將會確實帶來更小的目標**和更高的快取命中率!

c++編譯器會為成員函式的指令建立唯一乙份拷貝,供該類的任何物件共享,節省了記憶體空間。

1.2解決類成員名和引數名的衝突

在成員函式中,如果引數名和類成員變數一樣時,引數名被使用,類成員名被隱藏。通過在成員變數名前新增類名和雙冒號,或使用this指標來解決。

void

clsa

::setvalue

(intx,

inty

)

在類成員函式中,可以使用

this指標,也可以顯式地傳遞

this指標給另乙個函式。

1.3建構函式和析構函式

在建構函式中可以使用預設引數值,當呼叫沒有為函式指定引數時,使用預設變元。預設變元僅僅能放置在引數列的最後,也就是預設變元後不能有其他引數。

classa

void

main()

定義函式時,乙個引用變數不能被定義為預設引數。

初始化類成員的另一種方法如下,建構函式初始化類資料成員的順序與資料成員在類中的宣告順序是一致的,與初始化類資料成員的排列順序無關。

class

clsa

clsa

::clsa

():x(4

), y(x

) 結果:x、y都為4

class

clsa

clsa

::clsa

():y(

4), x(

y) 結果:y為4, x為系統分配數值

1.3.1 拷貝建構函式

拷貝建構函式是乙個特殊的建構函式,當建立乙個新物件時,系統自動呼叫它;另外,它的功能在於將物件的引數列表逐域拷貝到新建的物件中。

拷貝建構函式的定義有兩種形式:

<1>系統定義(預設拷貝建構函式)

class

point

private:

intx, y

;    

};

void

main()

<2>使用者定義

拷貝建構函式定義形式如下左表:

point

::point

(const

point&p

) point

::point

(const

point*p

) 拷貝建構函式的呼叫同上,這時程式呼叫使用者定義的拷貝建構函式,而不是系統本身的拷貝建構函式。

但是,上表右側函式

不是使用者自定義的拷貝建構函式。

在傳遞大型物件時,使用

常量引用引數既能模擬傳值呼叫的安全性,又能避免傳遞大型物件拷貝的開銷。

1.4靜態成員

類的靜態成員可以是資料成員,也可以是成員函式。靜態成員的特徵是,不管該類建立了多少個物件,其靜態成員只有乙個副本,這個副本被屬於這個類的所有物件共享。

1.4.1靜態資料成員

當建立類的第乙個物件時,類的所有靜態資料成員被初始化,若有沒有被初始化的靜態資料成員,系統報錯;再次建立物件時,不需要對靜態資料成員進行初始化。類的所有物件共享類的靜態資料成員,它不會隨某個物件而改變。靜態資料成員可以由靜態成員函式訪問,也可以由非靜態成員函式訪問。

靜態類物件,在宣告時呼叫建構函式一次,程式終止時呼叫析構函式。

1.4.2靜態成員函式

靜態成員函式屬於整個類,而不屬於類中的某個物件。靜態成員函式僅能訪問類中的靜態資料成員或全域性變數,不能訪問非靜態資料成員;靜態成員函式僅能呼叫類中的靜態成員函式和全域性函式,不能掉用類中非靜態成員函式。靜態成員函式中沒有this指標,無法判斷當前物件是哪乙個,也無法判斷靜態資料成員屬於哪個物件,所以如果在函式中需要確定物件,一般採用引數傳遞物件的方法。在呼叫靜態成員函式的前面,物件名和類名,必須綴上乙個,否則是錯誤的。在不強調呼叫物件的前提下,使用物件名和類名是一樣的。

注意:

用const去宣告乙個靜態成員函式會導致編譯錯誤。

(modifiers not allowed on static member functions

error executing cl.exe.)

const

char

* sys

= "win32"

; //全域性變數

classa;

static

intgetcount

(void)

static

intgetcount(a

a)static

char

* getstr()

private:

static

intcount;

}; inta

::count= 0

; void

main()

1.5 類物件作為資料成員

某個類物件或指標可以成為另乙個類的資料成員。在對類呼叫建構函式進行初始化時,如果需要傳遞引數給物件成員,也必須呼叫內部物件所在類的建構函式進行初始化。

classa

}; classb;

b::b

(inti):

a(i)

void

main()

1

.6 const 物件和const 成員函式

注意:1 const成員函式不能保證,在呼叫成員函式期間類物件引用的所有東西都保持不變。例如,類中如果含有指標,那麼在const成員函式中就能修改指標所指的物件。

#include

class text ;

void test::bad( const string &parm ) const

第一章學習筆記

看c primer已經好幾遍了,但是還是有很多基礎的問題,總是那樣容易忘記,這次看的時候,決定好好的寫寫讀書筆記 希望能夠認真的堅持下去。incluede的兩種不同格式 include some file 表明檔案是乙個標準工程,查詢先檢查預定義的目錄。include my file 表明改檔案是使...

Linux學習 第一章

1.linux應用程式 可執行檔案 計算機可以直接執行的程式 的.bat cmd 檔案。2 path 變數,新增路徑,使用 分隔 3 linux 使用正斜線 分隔檔名裡的目錄名,4 標頭檔案 提供對 常量的定義和對系統函式及庫函式 呼叫的宣告 一般位於 usr include 目錄及其子目錄中 依賴...

機器學習第一章

q 什麼是機器學習 機器學習不同於以往的計算機程式設計,致力於研究如何通過計算機手段,利用以往的經驗來改善系統自身的效能。一般的程式設計都是明確的告訴電腦該做什麼。機器學習希望提供資料給學習演算法,讓它自己學習,找到其種的規律。在面對新情況的時候就能應用已產生的模型,提供相應的判斷。機器學習的本質任...