1. 程式人生 > >C/C++struct與C++struct/class關鍵字詳解

C/C++struct與C++struct/class關鍵字詳解

C/C++中的struct

C中的struct只是一個簡單單單結構體,其中只能宣告變數,而不能宣告函式,而C++中的struct中卻可以有函式。

C++中struct成員預設訪問許可權為public,這是為了相容C。在C中沒有訪問許可權這一說。

C++中的struct/class(轉)

1.字面上的區別

在字面上struct是structure的縮寫,通常叫做“結構體”,在C語言裡用於將多種資料、多個變數組織在一起,便於表達比較複雜的資料型別,在C++中為了相容C語言保留了該關鍵字,並且保留了C語言中的所有功能。

而class,則稱作“類”,是C++新增來支援面向物件思想概念中“類”的概念的一個關鍵詞,並且比struct具有了更強大的功能,不僅可以像C語言中的struct一樣把資料組織在一起,還可以將與資料相關的方法組織在一起,並增加了如虛擬函式、繼承等特性來支援面向物件程式設計。

雖然在字面上struct與class的含義不一樣,但在C++中其功能基本是相同的,C++中的struct不僅可以包含資料成員,而且與class一樣支援新增的面向物件特性,僅在以下細節上有略微差別。

既然兩者在字面上不一樣,為了更好地利用這一點,建議在C++中使用struct時仍然只使用C中的特性,來表示一些複雜的資料而不進行方法的封裝,這樣還可以提高軟體的可讀性。

2.預設成員許可權

struct的成員預設許可權是public,而class的成員預設許可權是private。例如:

struct Sb{ void f( void ) { } };

struct Sc : Sb{ };

class Cb{ void f( void ) { } };

class Cc1 : public Sb{ };

class Cc2 : Sb{ };

sb.f(); // 合法

cb.f(); // 不合法,因為在Cb類中f( )函式預設為private,此處不可訪問

建議在工程程式碼中顯示宣告成員的許可權,而有使用預設許可權,因為並不是所有人都知道這一點。

3.預設繼承方式

struct的預設繼承方式為public,而class的預設繼承為private,例如:

Sc sc; Cc1 cc1; Cc2 cc2;

sc.f(); // 合法

cc1.f(); // 合法,因為Cc1顯示地使用public繼承

cc2.f(); // 不合法,Cc2預設private繼承自Sb,在Cc2中f( )為private

在C語言中struct不可以繼承,雖然我們知道在C++中struct可以繼承,但在實際使用中,在不需要繼承的場合我們使用struct,而在需要繼承的場合使用class,這樣更貼近其字面意思,使程式有更好的可讀性。

雖然知道class的預設繼承為private,但並不是專案組的每個人都清楚這一點,建議在工程程式碼中不省略private,使程式碼可讀性更強。

4.用於定義模板引數

模板為C++語言新增特性,C語言沒有,只有class可用於定義引數,而struct不可以,例如:

template

class TValue {

private: T _v;

public: TValue(T v) : _v(v){}

T Get( void ) { return _v; }

};

此處只能使用class,不能使用struct。當然,此處還可以使用typename代替class,class與typename也僅在定義模板引數時可以互換,而且建議此時使用typename,因為這樣讀起來更接近人類語言,更具有可讀性。