1. 類的聲明與對象的定義
常用的方法是類的聲明與對象的定義分開
2.成員訪問限定符private,public,protected的含義
private:只能被類的成員函數訪問,類外不能被訪問(友元除外)
public:可以被類的成員函數訪問,也可以被類的作用域內的其它函數訪問
protected:在類外不能被訪問,但可以被派生類的成員函數訪問。
3.成員函數:可以訪問本類的任何成員(包括私有和公有的),可以引用在本作用域有效的數據
注意:它的權限(能否被調用),作用域(能使用什麼範圍內的數據和函數)
一般做法:需要被外界調用的函數聲明爲pblic作爲類的對外接口,並非所有的成員函數都指定爲public,不是準備爲外界調用,而是爲本類的成員函數調用,就應該將它們指定爲private
成員函數的存儲方式:
類定義對象時,系統會爲每個對象分配存儲空間。如果對象包含數據和成員函數,就要分別爲數據和成員函數分配存儲空間。一般情況下,不同類型的數據分配的存儲空間是不同的,而不同對象的函數代碼是相同的。如果爲每個對象的函數分配存儲空間,就會浪費許多存儲空間。於是就用一段空間來存儲這個共同的函數代碼段,在調用各對象的函數時,都去調用這個公用的函數代碼。在這種情況下,每個類的對象的存儲空間只是該對象的數據部分的存儲空間,不包括函數代碼所佔的存儲空間。函數代碼是存儲在對象空間之外的。於是就產生一個問題:雖然不同的對象調用成員函數都執行同一段代碼,但其執行結果一般是不同的。這是爲什麼?因爲c+設立了一個this指針,用來指向不同的對象
成員函數的inline聲明的作用:在調用該函數時,將函數的代碼段插入到調用點。若不用inline聲明,則調用該函數時,流程就會轉到函數代碼段的入口地址,在執行完函數代碼時,返回調用點
4.公用接口與私有實現分離
類的作用:把數據和算法封裝在用戶聲明的抽象數據類型。在類的聲明中,一般把所有的數據成員指定爲私有的,使它們與外界隔離。把需要讓外界調用的成員函數指定爲pulic,外界通過公用的函數實現對數據的操作。外界與對象唯一的聯繫渠道就是通過調用公用函數。因此,公有成員函數也稱爲用戶使用類的公用接口,即類對外的接口。不一定要把所有的成員函數聲明爲pulic,那麼這些函數就不是公用接口。用戶只關心功能,而不關心實現,這樣就實現了接口和實現的分離。通過成員函數對數據操作稱爲類的實現。爲了防止用戶任意修改公有成員函數,實現的細節對用戶是隱蔽的,即私有實
5.類庫:分爲C++標準庫和用戶自定義的庫,方便編譯
類庫包含2個組成部分:類聲明頭文件,已經過編譯的成員函數的定義(目標文件)。用戶只需將類庫裝入計算機系統中,然後包含要使用的頭文件,即可使用這些類和成員函數。類聲明頭文件就成爲用戶使用類的公用接口,在頭文件的類體中還可以看到成員函數的聲明。包含成員函數的文件就是類的實現。
接口和實現分離,爲軟件開發商向用戶提供類庫創造了很好的條件。開發商把用戶所需的各種類的聲明放在不同的頭文件中,同時把對包含成員函數的定義的源文件進行編譯,得到函數定義的目標代碼。然後向用戶提供類的聲明的頭文件和成員函數定義的目標代碼(不提供函數定義的源代碼)
6.構造函數(constructor)和析構函數(destructor)
在類對象進入其作用域時就會調用構造函數。構造函數沒有返回值,函數名與類名相同,其作用是對對象進行初始化。構造函數是定義對象時系統自動調用的,且只執行一次。構造函數一般聲明爲pulic.構造函數不能被顯示的調用
如果用戶沒有定義構造函數,那麼C++系統會自動生成一個構造函數。只是這個構造函數的函數體爲空,沒有參數,不執行初始化操作。
帶參數的構造函數: 參數的初始化表
如box(int len,int w,int h ):length(len),height(h),width(w){}//len初始化成員變量length......
構造函數重載:
默認構造函數:不帶實參的構造函數。一個類只能有一個默認構造函數
析構函數:當對象的生命期結束時,會自動調用析構函數。如~box()。析構函數不能被重載,一個類只能有一個析構函數。其作用不是刪除對象,而是在撤銷對象佔用的內存之前完成清理工。
執行析構函數的具體情況:
1.在函數中定義一個對象(自動局部對象),函數定義結束時,對象自動釋放。在釋放前自動調用析構函數;2.static局部對象在函數調用結束時並不釋放,因此不調用析構函數。只在main()結束或調用
exit()函數結束程序時,才調用static局部對象的析構函數;3.若定義一個全局對象,當離開其作用域時(main()結束或調用exit()),調用析構函數;4.new運算符動態建立一個對象,用delete釋放對象時,先調用析構函數
構造函數與析構函數調用的順序:對於同一類的存儲類別,析構函數調用的順序與構造函數相反。即先構造後析構。不同類的存儲類別,如上(析構函數的具體情況)
7.對象數組和對象指針
this指針:在每個成員函數中都包含一個特殊的指針,this指針,它是指向本類對象的指針。它的值是當前被調用的成員函數所在對象的起始地址。this指針是隱式使用的,它是作爲參數傳遞給成員函數的
如 int box ::valum()
{
return height*width*length
}
C++把它處理爲
int box::valum(box *this)
{
return (this->height)*(this->width)*(this->length);
}
8.const對象,const變量,const指針
在定義變量時,加上const關鍵字,則變量的值在程序運行期間不能改變,這種變量稱爲常變量,即const變量,如:const int a = 3;定義常變量時必須初始化,且它的值不能在改變。常變量不能出現在賦值的左邊。從計算機實現的角度看,常變量是在變量的基礎上加上限制:存儲單元的值不能變化。因此常變量又稱爲只讀變量
const變量是從應用的角度提出的,如有時要求某些變量的值不允許改變(某些函數的參數),這時就用const加以限制
常對象:const Time t1(22,10,10)//常對象必須初始化,對象t1所有成員的值都不能改
const對象不能調用非const成員函數
如何引用const對象的成員呢?將函數聲明爲const即可
如 void get_time() const (常或const成員函數
常對象成員:常數據成員和常成員函數
常數據成員的值不能改變。只能通過構造函數的參數初始化表對常數據成員,不能採用構造函數對常數據成員進行賦
如果將成員函數聲明爲常成員函數,只能引用本類的數據成員,不能修改它們。常成員函數在聲明和定義時都要用const ,調用時不必加const
const數據可以被const成員函數引用,也可以被非const成員函數引用
const成員函數可以引用const數據成員,也可以引用非const數據成員
如果對象被定義爲常對象,只能調用其中的const成員函數。不要誤認爲const對象的成員函數都是const成員函數。const對象只能保證其數據成員是const數據,其值不能被修改。如果const對象的成員函數沒有const關鍵字,編譯系統把它作爲非const成員函數處理。
const指針:一個指針固定的與一個對象相聯繫,常用來做函數的形參
在C++程序設計中,常用const指針和const 引用做函數的形參,這樣既能保證數據安全,在調用函數時又不必建立實參的拷貝
調用函數建立實參的拷貝時,都要調用複製拷貝構造函數,有時間開銷。用const指針和const引用做函數形參,可以提高程序運行效率
對象的動態建立和釋放:new 和delete運算符