1. 程式人生 > >C++ 類和結構體的對比

C++ 類和結構體的對比

我一開始只學習過C語言中的結構體,並且認為C++裡的結構體和C裡的是一樣的,在C++中也一直按照C的方式使用結構體。但我後來發現,C++中的結構體和類在語法上好像沒什麼兩樣,給我造成了很大困惑。究竟C++中的類和結構體有何異同?要解決這個問題,讓我們先從C中的結構體說起。

C語言中的結構體

(1)由於C語言是面向過程的,所以C中的結構體就不存在面向物件的任何特點:不能繼承;不能封裝;不能多型;不存在訪問控制,只有作用域。

(2)C語言中的結構體只能定義資料,而不不能定義方法,雖然C語言的結構體中不能定義函式,但是卻可以定義函式指標,不過函式指標本質上不是函式而是指標。

(3)C語言中的結構體不能為空,否則會報錯。定義一個結構體的變數時,結構體名前的struct關鍵字不能省略,否則會報錯。

struct  A
{
    int num;
};
int main()
{
    struct A a = { 1 };
}

C++中的類和結構體

C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同資料型別的資料結構了,具有class的特性,而class也可用作struct:

  1. C++中的類和結構體都可以繼承,struct可以繼承class,同樣class也可以繼承struct。
  2. C++中的類和結構體都可以封裝,兩者都可以包含成員變數和成員方法,都可以具有建構函式和解構函式。
  3. C++中的類和結構體都可以多型,允許成員函式是虛擬函式可以多型。
  4. C++中的類和結構體都具有訪問控制,都可以用public、protected、private修飾其成員變數和成員方法。
  5. C++中的類和結構體都是按指傳遞的。另外,都可以同過彼此的方式初始化(此時情況較多,讀者可自行總結)。
class A
{
public:
	int a;
	int b;
};
struct B
{
	int a;
	int b;
	B(int a, int b)
	{
		(*this).a = a;
		(*this).b = b;
	}
};
int main()
{
	A a = { 1, 2 };	    //A是類
	B b(1, 2);	    //B是結構體
	return 0;
}

而struct和class之間最本質的一個區別就是預設的訪問控制: struct預設的資料訪問控制是public的,而class預設的成員變數訪問控制是private的。

在繼承方面,struct可以繼承class,class同樣可以繼承struct。但是,struct預設是public繼承,class預設是private繼承。也就是說,在不指定繼承方式時,struct是public繼承父類的,class是private繼承父類的,無論父類是class還是struct。具體繼承規則如下:

子類對基類成員的訪問許可權
基類成員的訪問許可權 public繼承 protected繼承 private繼承
public 在子類中為public 在子類中為protected 在子類中為private
protected 在子類中為protected 在子類中為protected 在子類中為private
private 在子類中隱藏 在子類中隱藏 在子類中隱藏

總之,當你顯式指定各自的訪問許可權時,兩者就會變得相同。所以,對於訪問控制,應該在程式裡明確的指出,而不是依靠預設,這是一個良好的習慣,可以避免一些不必要的麻煩,也讓你的程式碼更具可讀性。