淺談C++的class (初學者請看) 高手老手不用浪費網費 (轉)

worldblog發表於2007-12-12
淺談C++的class (初學者請看) 高手老手不用浪費網費 (轉)[@more@]

作為面向設計的基礎,掌握class的基本結構和特性是十分重要的。

 :namespace prefix = o ns = "urn:schemas--com::office" />

1.  如何實現一個class

class egclass {

public:

  //public提供了一組公開的操作和運算子

  //這些公開的操作函式和運算子被稱為member functions

//宣告或定義constructor(建構函式)和destructor(解構函式)

private:

  //私有的實現細節

    //member functions的定義部分

  //宣告data members

  //也可以初始化 data members 一般初始化data member的部分放在constructor裡

}

所有的member functions都必須在class裡宣告,至於是否同時給出定義,可自行決定。如果在class主體內定義,這個member functions將被視為inline函式(注:inline函式相當與一個宏)。如果在class體外定義一個member functions必須使用特殊的語法指明其屬於哪個class。如果希望該函式為一個inline函式,應在最前面指定關鍵字inline。

Inlne bool stack::empty()

{

  //定義member functions

}

上例就指明empty()是class stack的一個member functions。Class名後的兩個冒號(stack::)被稱為class pe resolution(類範圍決議)運算子。用來指明該member functions

是屬於哪個class的。

 

2.  Constructors(建構函式)和destructors(解構函式)

Constructors是用來初始化data members的。會在每次class 被定義時,constructors來初始化data members。

Constructors的函式名必須與class名稱相同。而且constructors不應指定返回值,且不需要返回任何值。它可以overloaded(過載)。最為class的一個member functions它是可以被定義在class體外的。

egclass::egclass();  //這是一個最簡單的constructor

Destructor時一個與constructors相對的member functions。其定義是由自行決定的。

如果class中有提供destructors 。當object結束生命時,編譯器會自動呼叫destructors。desrructor是主要用來釋放在constructors中或是物件執行週期中的資源。

Destructors命名是十分嚴格的,其函式名必須是class名稱加上‘~’。它不帶任何引數,也不返回任何值。更不可能overloaded。eg:

~egclass()

{

  //具體實現部分

}

  Member Initialization List (成員初值表)

  一般constructors初始化data member有兩種方法,一種是在函式體 內

  egclass::egclass (const egclass &rhs)

  {

    _data_member1=rhs._data_member1;

  _data_member2=rhs._data_member2;

}

而另一種初始化語法就是所謂的Member Initialization List (成員初值表):

egclass::egclass (const egclass &rhs): _data_member1(rhs._data_member1),

        _data_member2(rhs._data_member2)

{}   //注意 函式體是空的

 

3.  const(不變)和mutable(可變)

當一個函式呼叫一個class時,我們可以這樣來保證這個class不被改動:

int sum( const egclass &class1)

{

  //具體實現部分

}

但是如果sum呼叫了這個class的一個member functions,那這個class的值就有可能被它的一個member functions所修改。為了能讓這個class的值不被它的member functions所修改。我們必須在member functions上標註const,來告訴編譯器這個member functions不會改動class object。

Class egclass {

Public:

  //這些是const member functions 他們不會改動class object

  int length() const;

  int ended() const;

  //這些是 non-const member functions

  int nex();

private:

  //…

}

  const應該接在member functions的參數列後,如果在class的體外定義的const member functions,那就必須同時在宣告和定義中都指定const。

  關鍵字mutable可以讓一個data member 具有這樣一個性質:當它的值被改動後,並不會破壞class object的常數性。

4.  this指標

看一下這個例子;

Stack & Stack::

traner(const stack &rhs)

{

  _ip=rhs_ip;

  _size=rhs._size;

  return ???    //這是我們應該返回各什麼值哪?

}

this指標就是解決這個問題的。This指標在member functions中用來定址其呼叫者的,這時返回值可以這樣寫了 return *this;

整個member functions就可以這樣改寫啦

Stack & Stack::

transfer(const stack &rhs)

{

  if (this !=&rhs){

  _ip=rhs_ip;

  _size=rhs._size;

  }

  return *.this; 

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991877/,如需轉載,請註明出處,否則將追究法律責任。

相關文章