[小小測試] C/C++ 與 Java、struct 與 class 用法比較
Java 跟 C++ 誰好誰壞的問題已經有很多人討論,但是跟這次的主題沒有關係喔!我們這次要來玩的是 C/C++ 中的 struct/class 和 Java 的 class 呢!
首先讓我們先檢查一下各種等一下要實驗的東西吧!(要複習一下用法的人請先看附錄)
- 放個變數(Variable)
- 放個副程式(Function)
- 存取方法(Usage)
- 各種修飾子(Modifier)
恩,先從儲存變數開始好了!
typedef struct { int len; int width; }Rectangle;
▲ C /C++的 struct 都可以放變數
public class Rectangle { int len; int width; }
▲ Java 的 class 也理所當然地可以
class Rectangle { public: int len; int width; };
▲ C++ 的 class (C 沒有 class)
各位有沒有發現呢?小獅在 C++ 的 class 中加了 public 這個東西喔!這是因為阿,若是不加上去的話,就會出現如下的錯誤訊息呢!
E:\cppc.cpp||In function 'int main()':| E:\cppc.cpp|8|error: 'int Rectangle::len' is private| E:\cppc.cpp|15|error: within this context| E:\cppc.cpp|9|error: 'int Rectangle::width' is private| E:\cppc.cpp|16|error: within this context| E:\cppc.cpp|8|error: 'int Rectangle::len' is private| E:\cppc.cpp|17|error: within this context| E:\cppc.cpp|9|error: 'int Rectangle::width' is private| E:\cppc.cpp|18|error: within this context| E:\cppc.cpp|8|error: 'int Rectangle::len' is private| E:\cppc.cpp|19|error: within this context| E:\cppc.cpp|9|error: 'int Rectangle::width' is private| E:\cppc.cpp|19|error: within this context| ||=== Build failed: 12 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
大致上是告訴我們,因為 len、width 是 private,所以不能使用,至於為甚麼,請看底下的表格:
相同類別(class) | 子類別(sub-class) | 所有地方(ex. 主程式) | |
public | Y | Y | Y |
protected | Y | Y | N |
private | Y | N | N |
▲ C++ 的存取修飾子(Access modifiers in C++)
哦~原來 C++ 的 Class 預設的(Default)存取修飾子是 Private 啊!
那 C/C++ 的 struct 又是甚麼呢?
沒錯,我們已經知道,struct 的元素不需要事先宣告為 public 就可以在主程式(相對於 struct 不為子類別)中使用,所以我們可以知道它們預設就是 public!
測試過了變數的部份,我們接下來要試著放一些副程式(function)看看!
(Ps. 小獅我知道 函式(function)跟 方法(method) 有一點不一樣啦~只是有點懶的在這裡說明<( ̄︶ ̄)>)
為了公平起見(避免被說我偏心), 我們這次先從 Java 開始好了,
public class Rectangle { public int len; public int width; public int area() { return len * width; } }
▲ 作為一高階物件導向語言,class 內放方法(method)不是問題
class Rectangle { public: int len; int width; int area() { return len*width; } };
▲ C++ 的 class 也順利過關
typedef struct { int len; int width; int area() { return len*width; } }Rectangle;
▲ C++ 的 struct 同樣繳出漂亮成績
typedef struct { int len; int width; int area() { return len*width; } }Rectangle;
▲ C 的 struct 程式碼
編譯器輸出:
error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘{’ token| |In function ‘main’:| error: ‘Rectangle’ has no member named ‘area’| ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
▲ 嗯~好,我看不懂Orz
痾,總而言之,根據這篇文章所述,其實 C 本身並未支援這樣的用法,但可以透過其他迂迴的方式達成(雖然他也說了,實務上並不常見)
Ya~ Facebook 登入成功!