->關於類和物件的進一步討論
1、類的初體驗:
class box//使用了引數初始化表,此種構造引數是較長用到的,要看得懂
//box(int a=0,int b=2,int c=3);//這裡使用了預設引數的建構函式,但是如果我們要申請物件,例如:box a,那編譯器將不知道使用上面的box()建構函式還是用這個,所以出現歧義,不正確
int vollume();//公有函式的宣告,這裡是求體積
private:
int height;
int wight;
int lenght;
};box::box(int a, int b, int c)
int box::vollume()
注意:我們不應該同時使用類的建構函式的過載與擁有預設引數的建構函式,這樣容易出現二義性(函式也如此)。
2、建構函式與析構函式:
(1)呼叫順序這兩個是剛好相反的。在初始化物件的時候,建構函式的呼叫是從基類到派生類;在物件銷毀的時候,呼叫析構函式,呼叫順序是從派生類到基類。
(2)建構函式不能使虛函式(後面會詳細的總結虛函式的東西),而析構函式,在有繼承關係的體系中最好是虛函式。原因是建構函式要先呼叫基類的建構函式,再呼叫派生類的建構函式,如果要是虛函式,那麼會只呼叫基類的或者是派生類的,這樣下來構造不完全;析構函式之所以最好設定為虛函式,是因為要保證釋放的完全性。在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。
(3)析構函式中不要拋異常。雖然語法上面沒有錯,但是會帶來重大隱患。如果一定要拋的話,最好不要讓異常跑出,在析構函式內部捕獲。 阻止異常傳遞到析構函式外有兩個原因,第一能夠在異常轉遞的堆疊輾轉開解(stack-unwinding)的過程中,防止terminate被呼叫。第二它能幫助確保析構函式總能完成我們希望它做的所有事情。
3、共用資料的保護:(這個地方是const的在類上面的詳盡用法,很繁瑣,我梳理一下)
(1)常物件、常成員函式、常資料成員。
資料成員
非const成員函式
const成員函式
非const的資料成員
可以引用,也可以改變值
可以引用,但不可以改變值
const資料成員
可以引用,但不可以改變值
可以引用,但不可以改變值
const物件的資料成員
不允許引用和改變值
可以引用,但不可以改變值
其中常物件的是用來保護資料成員用的,除了常物件中的const型別的資料成員函式能引用資料成員,其他的都不行;常成員函式的宣告方式:void function() const;常資料成員只能通過建構函式的引數初始化表對常資料成員進行初始化,例如:
time::time(int h)
time::time( int h ):hour(h){}//正確
(2)指向物件的常指標、指向常物件的指標變數。
指向物件的常指標:time * const ptr1,這樣的情況,那ptr1這個指標一旦初始化,之後就能能再修改其指向,例如
ptr1 = &time;//初始化
ptr1 = &t2;//錯誤,因為常指標不能修改其指向
指向常物件的指標變數:這裡對於指向常物件的指標變數有三個關鍵性的解說
①如果乙個變數已被宣告為常變數,只能用指向常變數的指標變數指向他,而不能用一般(指向非const型的變數)指標變數去指向他;
②指向常變數的指標變數除了可以指向常變數外,還可以指向未被宣告為const的變數。此時不能通過此指標變數改變該變數的值;
③如果函式的形參是指向非const型變數的指標,實參只能用指向非const變數的指標,而不能用指向const變數的指標,這樣,在執行函式的過程中可以改變形參指標變數所指向的變數的(也就是實參指標所指向的變數)值。總之一句話就是:指向常變數的指標變數可以指向const和非const型的變數,而指向非const型變數的指標變數只能指向非const的變數。
指向常物件的的指標變數類似:
①如果乙個物件已被宣告為常物件,只能用指向常物件的指標變數指向他,而不能用一般的指標變數去指向他。例如
const time t;
time t2;
const time *p;
p=&t;//正確
p=&t2;//錯誤
②如果定義了乙個指向常物件的指標變數,並使他指向乙個非const的物件,則其指向的物件是不能通過指標來改變的
。例如time t;
const time t2;
const time * p = &t;
t.hour = 19;//正確,因為是常物件
p->hour=19;//錯誤,因為是指向常物件的指標
(3)常引用:void function(const time &t),這樣在function函式當中我們就不能修改物件t的值了。在c++程式設計過程中,我們經常用到常指標和常引用做函式引數,主要就是保證資料不會被修改。
4、物件的複製與物件的賦值:這兩個有概念和本質的不同,其中物件的複製是在乙個物件初始化了,用這個初始化的物件去完全複製的初始化另外乙個物件,例如
time t1;
time t2(t1);//或者是:time t2=t1
這樣;而物件的賦值是兩個都初始化了的物件進行賦值,例如
time t1,t2;
t1=t2;
這樣。(我們要注意識別具體在哪是物件的複製,在哪是物件的識別,例如在函式返回值的時候就是物件的複製等。這個問題在今年筆試中也考到過。因為是這種細節細緻的知識點,各大公司的筆試都願意出!)
5、靜態資料成員、靜態資料成員函式。
(1)靜態資料成員:
①在類中定義了靜態資料成員,即使不定義物件,也為靜態資料成員分配空間,他可以被引用;
②靜態資料成員是在程式編譯時被分配空間的,在程式結束時才釋放空間;
③靜態資料成員可以初始化,但只能在類體外進行初始化。
(2)靜態資料成員函式:
①這種成員函式內部並沒有this指標。(這點很關鍵)所以在不指定物件的名的情況下,在這種成員函式之中不能對物件的資料成員進行訪問。
②這種資料成員函式主要就是對靜態資料成員進行處理的函式。
6、友元函式與友元類的問題。友元函式與友元類能訪問類中的private成員和protected成員。他的用處主要是在後面的運演算法過載當中用的比較多。
p.s:模板(template
譚浩強C 程式設計第14章C 工具
第14章 c 工具 2,c 處理異常的機制是由3個部分組成的,即檢查 try 丟擲 throw 和捕捉 catch 把需要檢查的語句放在try塊中,throw用來當出現異常時發出乙個異常資訊,而catch則用來捕捉異常資訊,如果捕捉到了異常資訊,就處理它 4,try catch 異常資訊型別 變數名...
譚浩強C 程式設計 指標習題11
在主函式中輸入 個等長的字串。用另一函式對它們排序。然後在主函式 出這 個已排好序的字串。用指標陣列處理上一題目,字串不等長。include include include using namespace std main 3.心得 1.name 10 按照結合的方式是指標陣列,就是陣列的每一元素都...
C語言程式設計譚浩強版 一
本章的一些概況這裡就不說了,直接進入細節的學習!3.1 c的資料型別 資料型別分為 基本型別 構造型別 指標型別 空型別 基本型別又分為 整型 字元型 實型 浮點型 又分為單精度型 雙精度型 列舉型別 構造型別又分為 陣列型別 結構體型別 共用體型別 3.2 常量和符號常量 在程式執行過程中,其值不...