《面向物件程式設計 C++》 類
類宣告
class Human
{
public:
//...data
private:
//...data
}
class是個關鍵字,用其來宣告類
類範圍
類的私有成員具有類範圍性質,類的私有成員僅能由類的成員函式訪問。
例如:
class C{
public:
void m(); //public scope
private:
char d; //class scope (private scope)
};
本例中的類宣告賦予資料成員d類範圍性質(因為d是私有的)。
在C++中,用關鍵字class來宣告的類,其類成員在預設情況下具有類範圍性質,在這種情況下,如果沒有為類成員指定任何訪問限制符(public、private或protected),這個成員將作為私有成員處理。
關鍵字class和struct區別
使用class關鍵字或struct關鍵字都可以建立類。如果使用class關鍵字,類成員在預設狀態下是私有的;而使用struct關鍵字,類成員在預設狀態下是公有的。
類成員函式的定義
類成員函式定義有兩種途徑:
- 成員函式的宣告在類宣告之中進行,但在類宣告之外定義。
- 成員函式的定義也可在類宣告之中進行,這種定義方式為inline,C++關鍵字inline專門用來表示內聯。
內聯定義方式同時提供了成員函式的宣告和定義。
例如:
class Person
{
public:
void setAge( unsigned n );
unsigned getAge() const;
private:
unsigned age;
};
void person::setAge( unsigned n)
{
age = n;
}
usigned Person::getAge() const
{
return age;
}
本例在類宣告之中聲明瞭Person類的各種成員函式,然後在類的宣告之外定義這些函式,在定義成員函式時使用了域解析**:: **。
又例如:
class Person
{
public:
void setAge( unsigned n ){ age = n;}
unsigned getAge() const { return age; };
private:
unsigned age;
};
本例在類宣告中定義了Person類的各種成員函式,所以這些函式都是inline型別的。行內函數通知編譯器用成員函式的函式體替換掉所有對該函式進行宣告呼叫的程式碼,這樣在替換後的程式碼中不再出現對這個函式進行呼叫的程式碼。
class Person
{
public:
inline void setAge( unsigned n );
inline unsigned getAge() const;
private:
unsigned age;
};
void person::setAge( unsigned n)
{
age = n;
}
usigned Person::getAge() const
{
return age;
}
而通過在進行成員函式宣告的時候使用inline關鍵字,可將原本定義在類宣告之外的成員函式強制變成行內函數。
通過引用傳遞和返回物件
和其他型別的變數一樣,物件既可以採用傳值方式傳遞給函式,也可以採用引用方式作為函式的返回值。除非迫不得已,一般來說應該採用引用方式進行物件的傳遞和返回,而不要採用傳值的方式來進行。這是因為通過傳值方式來傳遞和返回物件時會降低效率並將面臨物件間的拷貝操作,從而使資料增大,浪費記憶體。而採用引用方式,則完全可以避免上述弊病。
const型別引數物件引用
通常,如果一個物件通過引用方式傳到函式f中,而函式f又不會通過修改物件的資料成員的值改變該物件的狀態,那麼,最好將f的引數標記為const,可以預防物件引數的誤寫,同時有些編譯器還可以對這種情況進行一些優化。
例如:
class C {
public:
void setName( const string& n) {name = n; }
private:
string name;
};
函式setname的string型別引數n標記為const,表明setName不會改變n,只將n賦值給資料成員name。
const成員函式
例如:
class C{
public:
void set( int n ) { num = n;}
int get() const {return num;}
private:
int num;
};
本例中,由於get成員函式不需要改變類C的任何資料成員,因此將get成員函式標記為const,注意,const關鍵字出現在引數列表與其函式體之間。
由於get成員函式不更改任何資料成員,因此稱這種型別的函式為只讀函式。
一個const成員函式僅能呼叫其他const成員函式,因為const成員函式不允許直接或間接地改變物件的狀態,而呼叫非const成員函式可能會間接地改變物件的狀態。
class C{
public:
void set( const string& n) {name = n; }
const string& get() const{ return name; }
private:
string name;
};
在成員函式set中,因為set不改變string型別引數n,n被標記為const。成員函式get返回資料成員name的一個const型引用,此處的const表明誰也不能通過這個引用來修改資料成員name的值。成員函式get本身被標記為const,因為get不會改變類C唯一的資料成員name的值。