C Primer Plus 類基礎知識

2021-07-26 02:38:17 字數 4578 閱讀 6019

(一)  散知識

1,一種常見但不通用的規定------將類名首字母大寫;將類的資料成員名中使用 m_ 字首(m_a)或者在成員名中使用字尾 _ (a_);

2,不必在類宣告中使用關鍵字private,因為這是類物件的預設訪問控制;如:

class a

;

3,將const關鍵字放在函式括號後面來說明這是乙個「唯讀函式」。也就是說這個函式不會修改任何資料成員。宣告和定義都應該放const關鍵字,以這種方式宣告和定義的類函式被稱為const成員函式。任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其他非const成員函式,編譯器將指出錯誤,這無疑提高程式健壯性。

class temp

;temp::temp(int age)

int temp::getage() const

void main()

class a

;

因為宣告了

const

函式,所以不可以修改任何資料成員,但是在這裡給

age資料成員加了10,

所以產生錯誤。

(二) 類和結構的區別

類與結構的唯一區別,結構預設訪問時public,而類為private;

(三) 內聯方法

定義於類宣告中的函式都將自動成為內聯函式,一般將短小的成員函式作為內聯函式。

class test     

private:

int m_a;

int m_b;

};

如果願意也可以在類宣告之外定義成員函式,並使其成為內聯函式。為此,只需在類實現部分中定義函式時使用inline限定符即可。內聯函式的特殊規則要求在每個使用它們的檔案中都要對其定義,最簡便的方法是將內聯函式放在類的標頭檔案中:

class test   

;

inline int test::compareint (int a, int b) //use inline in definition

(四) 建構函式

1, 宣告和定義建構函式

程式在宣告物件時,將自動呼叫建構函式。建構函式的原型和函式頭有乙個有趣的特徵---雖然沒有返回值,但沒有被宣告為void型別,實際上建構函式沒有宣告型別。

class test::test ( int a = 0; int b = 0)     

2, 使用建構函式

c++提供兩種使用建構函式來初始化物件的方式。第一種:顯式地呼叫建構函式:

test testone = test(5 , 6);

第二種是隱式地呼叫建構函式:

test testtwo(5 , 6);

需要注意的是,無法使用物件來呼叫建構函式,因為在建構函式構造出物件之前,物件是不存在的。因此建構函式被用來建立物件,而不是通過物件來呼叫。

3, 預設建構函式

如果沒有提供任何建構函式,那麼c++將自動提供預設建構函式。如上面test類的預設建構函式可能是:

test :: test() ;
但需要注意的是,當且僅當沒有定義任何建構函式時,編譯器才會提供預設建構函式。如果為類定義的建構函式,就必須為它提供預設建構函式,否則下面的宣告將出錯:

test testthree;

因此如果要建立物件,並且不想顯式地初始化,則必須提供乙個不接受任何引數的預設建構函式。定義預設建構函式的方式有兩種。第一種是給已有的建構函式的所有引數提供預設值,也就是說預設建構函式可以沒有任何引數,如果有,則必須給所有引數都提供預設值:

test ( int a = 0; int b = 0);  //宣告

test::test ( int a = 0; int b = 0) //定義

另一種方式是通過函式過載來定義另一建構函式---乙個沒有任何引數的建構函式:

test ();

通常應提供對所有類成員做隱式初始化的預設建構函式,則上面的建構函式定義可以為:

test::test ();

乙個類中可以有多個建構函式,多個建構函式的的引數一定要不一樣,但只能有乙個預設建構函式,所以不要同時採用以上兩種方式。

使用上面任何一種形式建立預設建構函式後,邊可以宣告物件變數,而不對他們進行顯示初始化:

test

testfour

;  //隱式地呼叫預設建構函式  (注意區分test

testfour

(); 該宣告為宣告乙個返回

test

類物件的testfour

函式,隱式地呼叫預設建構函式不需要使用圓括號)

testtestfive = test();   //顯示地呼叫預設建構函式
4,程式中可以多次呼叫建構函式

假如test類存在如下建構函式與析構函式:

test ();  //預設建構函式宣告

test::test (); //預設建構函式定義

test ( int a ; int b); //自定義建構函式宣告

test::test ( int a; int b) //自定義建構函式定義

~test(); //析構函式宣告

test::~test() {}; //析構函式定義

程式中存在如下語句:

test testsix( 1 ; 2); 

test testseven = test( 3 ; 4);

testsix=test( 5 ; 6);

第一條語句建立乙個類物件testsix

並初始化為指定值,第二條語句使用另一種語法建立並初始化testseven

類物件,c++允許兩種方式執行第二中語法,一種是其行為與第一種完全相同,另一種是允許呼叫建構函式來建立乙個臨時物件,然後將該臨時物件複製到testseven

中,並丟棄它。如果編譯器使用這種方式,則將為臨時物件呼叫析構函式。第三條語句不是對testsix物件構造以及初始化,而是將新值賦給它。這是通過讓建構函式程式建立乙個新的、臨時的物件,然後將其內容複製給testsix來實現的,隨後程式呼叫析構函式以刪除臨時物件。注意,第二條語句可能會建立臨時物件(也可能不會),而第三條一定會建立乙個臨時物件。

5,c++11列表初始化

可以將初始語法用於類,只需提供與某個建構函式的引數列表匹配的內容,並用大括號將他們擴起:

test testeight = ;  //自定義建構函式匹配

test testeight {}; //與預設建構函式匹配

(五) 析構函式

和建構函式一樣,析構函式也沒有返回值和宣告型別,與建構函式不同的是析構函式沒有引數,因此test的析構函式的原型必須為這樣:

~test();
如果test的建構函式使用new來分配記憶體,則析構函式將使用delete來釋放這些記憶體。如果test的建構函式沒有使用new來分配記憶體,則析構函式不承擔任何重要的工作,因此可以將它定義為不執行任何操作的函式:

test::~test() {};
(六) 作用域為類的常量

有時候將符號常量的作用域為類很有用。例如將類宣告可能使用的字面值30來指定陣列長度。如:

class bakery

;double costs[month];

...

注意,用這種方式宣告列舉並不會建立類資料成員,也就是說所有物件中都不包含列舉。由於這裡使用列舉只是

為了建立符號常量,並不打算建立列舉型別變數,因此不需要提供列舉名。

第二,使用關鍵字static:

class bakery

{private:

static const int month = 12;

double costs[month];

...

這將建立乙個名為month的常量,該常量與其他靜態變數儲存在一起,而不是儲存在物件中。因此只有乙個month

常量,被所有bakery物件共享。

抽象類練習(c primer plus)

今晚看 c primer plus 做的練習題,呵呵,做的不怎麼好,希望高手如果有時間指點一二,謝謝誒!c primer plus p475練習題3 修改 basedma lacksdma hasdma類,讓他們都從乙個基類派生出來,實現和程式單13.10一樣的基本功能,注意使用基類陣列指標,在類中...

c primer plus筆記(5)函式基礎

return typename function name typename parameter name,函式原型 函式頭 形參 parameter 與傳值呼叫 1 形參 函式原型處的形參,其名稱僅相當於佔位符。所以單獨宣告函式原型的時候也可將變數名省略。return typename funct...

Android tensorflow 基礎知識學習

今天記錄下tensorflow的一些基本知識 1.匯入tensorflow 庫,且指令碼中新增執行使用的python環境 user bin env python import tensorflow as tf 匯入tensorflow庫 匯入 mnist 資料集 資料在linux 根目錄 data下...