(一) 散知識
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() {}; //析構函式定義
程式中存在如下語句:
第一條語句建立乙個類物件testsixtest testsix( 1 ; 2);
test testseven = test( 3 ; 4);
testsix=test( 5 ; 6);
並初始化為指定值,第二條語句使用另一種語法建立並初始化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下...