天天看點

第十二章 類 —— 第一節 類的基本組成

關于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、定義類型時,并不做記憶體空間的配置設定;當定義對象時,才為相應的對象配置設定存儲空間。