譚浩強C 程式設計第9章關於類和物件的進一步討論

2021-06-09 15:34:10 字數 3432 閱讀 9023

第9章 關於類和物件的進一步討論

1.      不能在類定義體中對資料成員初始化,因為類並不是乙個實體,而是一種抽象型別,並不佔據儲存空間,顯然無處容納資料;

2,建構函式不需要使用者呼叫,也不能被使用者呼叫;,在建立物件時由系統自動執行;建構函式一般宣告為public.

3,如果使用者自己沒有定義建構函式,則c++系統會自動生成乙個建構函式,只是這個建構函式的函式體是空的,沒有引數,不執行初始化操作;

4,帶引數的建構函式中的形參,其對應的實參在定義物件時給定;

5,函式具有相同的名字,而引數的個數或者引數的型別不相同,這稱為函式的過載;

6,呼叫建構函式時不必給出實參的建構函式,稱為預設建構函式,顯然無參的建構函式屬於預設建構函式,乙個類只能有乙個預設建構函式;

如果使用者未定義建構函式,則系統會自動提供乙個預設建構函式,但它的函式體是空的,不起初始化作用;

7,類的宣告是放在標頭檔案中的,使用者是可以看到的,而函式的定義時類的實現細節,使用者是看不到的。

8,乙個類只能有乙個預設建構函式,也就是說,可以不使用引數而呼叫的建構函式,乙個類只能有乙個;

下面呼叫有歧義,會出錯:

box();

box(int= 10;int =10; int =10);

9,在乙個類中定義了全部是預設引數的建構函式後,不能再定義過載建構函式了;

10,析構函式不返回任何值,沒有函式型別,也沒有函式引數,由於沒有函式引數,因此它不能被過載;

乙個類可以有多個建構函式,但是只能有乙個析構函式;

11,析構函式也可以用來執行「使用者希望在最後一次使用物件之後所執行的任何操作」

12,如果使用者自己沒有定義析構函式,c++編譯系統會自動生成乙個析構函式,但它實際上什麼都沒乾;

13,建構函式的形參名可以和資料成員名同名,但是最好不要這麼做;

student(intnum, string name, char ***):num(num),name(name),***(***){}

14.先構造的後析構,後構造的先析構,它相當於乙個棧,先進後出;

15,在全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫;

16.指向普通函式指標的方法:

資料型別名(*指標變數名)(引數列表)

void (*p)();

p=fun;

(*p)();//呼叫fun函式;

17,指向物件成員函式的指標

資料型別名 (類名::*指標變數名)(引數列表);

p2 = &time::get_time;

注意,後面沒有括號,不是p2 = &time::get_time();這是錯誤的;

18,常物件中的資料成員為常變數且必須要有初始值,如

time const     t1(12,34,46);

類名  const  物件名[(實參列表);

19,如果乙個物件被宣告為常物件,則不能呼叫該物件的非const型的成員函式(除了由系統自動呼叫的隱式的建構函式和析構函式)

20,編譯是以原始檔為單位的;

21,要引用常物件中的資料成員,只需要將該成員函式宣告為const即可;

void get_time() const;

這表明get_time是乙個const型函式,即常成員函式。常成員函式可以訪問常物件中的資料成員,但仍然不允許修改常物件中的資料成員的值;

想要修改,可以把該資料成員宣告為mutable,,宣告為可變的資料成員,這樣就可以用宣告為const的成員函式來修改它的值了;

22.只能通過建構函式的引數初始化列表對常資料成員進行初始化;初始化後就不能改變;

23,一般的成員函式可以引用本類中的非const資料成員,也可以修改它們,如果將成員函式宣告為常成員函式,則只能引用本類中的資料成員,而不能修改它們;

24,常成員函式可以引用const資料成員,也可以引用非const的資料成員,const資料成員可以被const成員函式引用,也可以被非const的成員函式引用;

注意:非const成員函式是不執行引用const物件的資料成員的;

25,常物件只保證其所有資料成員的值不被修改;

26,常成員函式不能呼叫另乙個非const成員函式;

27.物件的複製(複製建構函式)

複製建構函式也是建構函式,但它只有乙個引數,這個引數是本類的物件(不能是其他類的物件),而且採用引用的形式;

此複製建構函式的作用就是將實參物件的各個資料成員一一賦給新的物件中對應的資料成員;

28.如果使用者自己未定義複製建構函式,則編譯系統會自動提供乙個預設的複製建構函式,其作用只是簡單的複製類中每個資料成員;

29,複製建構函式什麼時候被呼叫:

1.      程式中需要新建乙個物件,並用另乙個同類的物件對它初始化;

2.      當函式的引數為類的物件時;(傳值呼叫,需要拷貝實參);

3.      函式的返回值是類的物件;也需要複製乙個臨時物件並傳遞;

30,靜態資料成員是在所有物件之外單獨開闢空間,只要在類中定義了靜態資料成員,即使不定義物件,也為靜態資料成員分配空間,它可以被引用;

31,靜態資料成員可以初始化,但只能在類外體進行初始化;

不能用引數初始化列表對靜態資料成員初始化,如未對靜態資料成員賦初值,則編譯系統會自動賦予初值0;

32,靜態資料成員既可以通過物件名引用,也可以通過類名來引用(必須是public);

33,與靜態資料成員不同,靜態成員函式的作用不是為了物件之間的溝通,而是為了能處理靜態資料成員;

靜態成員函式不屬於某一物件,因此靜態成員函式沒有this指標,既然它沒有指向某一物件,就無法對乙個物件中的非靜態成員進行預設訪問;

34,靜態成員函式可以直接引用本類中的靜態資料成員,在c++程式中,靜態成員函式主要用來訪問靜態資料成員,而不訪問非靜態資料成員;

35,友元函式:

如果在本類以外的其他地方定義了乙個函式(這個函式可以是不屬於任何類的非成員函式,也可以是其他類的成員函式),在類體中用friend對該函式進行宣告,此函式就稱為本類的友元函式。

乙個類的友元函式可以訪問這個類的私有成員;

36,只有在正式宣告乙個類以後才能用它去定義類物件;

37,友元關係不能傳遞;(用彼此間的朋友不是朋友來比喻);

38,類模板

template //宣告為乙個模板,虛擬型別名為numtype

class compare                            //類模板名為compare

public:

compare(numtypea ,numtype b)

39,由於類模板包含型別引數,因此又稱為引數化的類,

類模板是類的抽象,類是類模板的例項;

40,用類模板定義物件的方法:

comparecomp(4,7);            //類似於容器

41,如果在類模板外部定義成員函式,應寫成類模板形式;

temple 函式型別類模板名《虛擬型別引數》::成員函式名(函式引數表列)

c 程式設計梳理(譚浩強)9章

關於類和物件的進一步討論 1 類的初體驗 class box 使用了引數初始化表,此種構造引數是較長用到的,要看得懂 box int a 0,int b 2,int c 3 這裡使用了預設引數的建構函式,但是如果我們要申請物件,例如 box a,那編譯器將不知道使用上面的box 建構函式還是用這個,...

譚浩強C 程式設計第14章C 工具

第14章 c 工具 2,c 處理異常的機制是由3個部分組成的,即檢查 try 丟擲 throw 和捕捉 catch 把需要檢查的語句放在try塊中,throw用來當出現異常時發出乙個異常資訊,而catch則用來捕捉異常資訊,如果捕捉到了異常資訊,就處理它 4,try catch 異常資訊型別 變數名...

第15章 物件導向程式設計 9

15.4.3 複製控制和繼承 派生類也可以使用合成複製控制成員。合成操作對物件的基類部分連同派生部分的成員一起進行複製 賦值或撤銷,使用基類的複製建構函式 賦值操作符或析構函式對基類部分進行複製 賦值或撤銷。只包含類型別或內建型別資料成員 不含指標的類一般可以使用合成操作,複製 賦值或撤銷這樣的成員...