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:
- C++中的類和結構體都可以繼承,struct可以繼承class,同樣class也可以繼承struct。
- C++中的類和結構體都可以封裝,兩者都可以包含成員變數和成員方法,都可以具有建構函式和解構函式。
- C++中的類和結構體都可以多型,允許成員函式是虛擬函式可以多型。
- C++中的類和結構體都具有訪問控制,都可以用public、protected、private修飾其成員變數和成員方法。
- 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 | 在子類中隱藏 | 在子類中隱藏 | 在子類中隱藏 |
總之,當你顯式指定各自的訪問許可權時,兩者就會變得相同。所以,對於訪問控制,應該在程式裡明確的指出,而不是依靠預設,這是一個良好的習慣,可以避免一些不必要的麻煩,也讓你的程式碼更具可讀性。