關于C++的幾篇部落格,參考人民郵電出版社的《C++ Primer 中文版》一書。
本章着重介紹有關類的基本知識。
第十二章 類
C++用類來定義自己的抽象資料類型。 之是以有必要存在類的概念,是因為,資料抽象既能夠隐藏對象的内部表示,同時仍然允許執行對象的公有(public)操作。這種方式更接近人對事物的認知。
第一節 類的基本組成
類的基本組成包括:資料成員、成員函數。它們的屬性有三種:private,public,protected。
其中,構造函數和析構函數是類的一種特殊的成員函數,這裡我們隻簡單提及構造函數的基本概念。關于構造函數和析構函數的具體内容,将會在後續章節介紹繼承、虛函數等概念的時候再做具體介紹。
接下來,我們用一個例子來描述類的基本組成。
// 例1:
class Sales_item {
public:
double avg_price() const;
Sales_item(): units_sold(0), revenue(0.0) {}
private:
std::string isbn;
unsigned units_sold;
double revenue;
};
double Sales_item::avg_price() const
{
if (units_sold)
return revenue/units_sold;
else
return 0.0;
}
一、構造函數
1、構造函數,是一個特殊的、與類同名的成員函數,用于給每個資料成員設定适當的初始值。
2、一般使用一個構造函數初始化清單,來初始化對象的資料成員,如例1.
二、成員函數:
1、在類内部,成員函數必須做聲明,但可以不做定義。
2、成員函數定義在類内部時,預設為inline;定義在類外部時,注意兩點:第一,函數名前面需用作用域操作符指明該函數是屬于哪個類的成員函數(如例1);第二,不預設為inline。(inline:内聯函數。當調用inline函數時,編譯器将試圖在同一行内擴充該函數,這樣的執行效率高。)
3、在例1中,avg_price()是const成員函數,這種成員函數不能改變其所在對象的資料成員。此外,const在聲明和定義中都需要注明,否則會出編譯錯誤。一般地,當成員函數并不做修改類的資料成員的操作時,就定義為const的。比如,一些定義在類内部的具有列印(print)、顯示(display)等輸出功能的const成員函數。
三、資料成員:
public:可被使用該類的所有代碼通路,即可被類外的代碼通路
private:隻可被類内部的代碼通路。一般資料成員都習慣定義為private的,這樣就隻能是類内的成員函數才可能修改資料成員,友善查找運作錯誤。
protected:哇哦,這個複雜了。參考這篇部落格,講得比較清楚:blog.csdn.net/luoruiyi2008/article/details/7179788
下面,我們具體講解protected的屬性。書上原文是這麼介紹的:
The protected access label can be thought of as a blend of private and public :
- Like private members, protected members are inaccessible to users of the class.
- Like public members, the protected members are accessible to classes derived from this class.
-
In addition, protected has another important property:
A derived object may access the protected members of its base class only through a derived object. The derived class has no special access to the protected members of base type objects.
翻譯一下:
protected是private和public的混合(或折中):
a. 在沒有繼承的情況下,和private一樣,protected隻能被類内部代碼通路,外部的使用類的代碼不可通路
b. 基類的protected,可以被派生類内部直接通路
c. 基類的protected,不可以被使用派生類的外部代碼直接通路(直譯:另外,protected還有另外一個重要特性:派生類對象如果要通路基類protected成員隻有通過派生類對象,派生類不能通路基類對象的protected成員。)
關于protected,将會在後續涉及到繼承的章節中繼續講解。目前到這裡,還是有點似懂非懂的,嗯...比較麻煩,後面再慢慢一點點深入了解吧!
PS: 關于類的其他幾點總結
1、當類定義體完全完成後,才能定義類,是以類不能具有自身類型的資料成員。然而,隻要類名一出現,就可以認為該類已聲明。是以,類的資料成員雖然不能是自身類型,但可以是指向自身類型的指針或引用。
例2:
class LinkScreen {
Screen window;
LinkScreen *next; // ok
LinkScreen &prev; // ok
LinkScreen other; // error
}
2、定義類型時,并不做記憶體空間的配置設定;當定義對象時,才為相應的對象配置設定存儲空間。