之前因為都在忙著畢業的開題答辯與投稿論文的事宜,一直沒有時間更新這個系列的文章。看了我上一篇霧中風景的文章,師弟希望我繼續把這個系列的文章寫下去。坦白說,C++的特性很多,這也不是教學指南的文章,我會選取一些自己在學習C++過程之中值得探討的問題和大家聊一聊,拋磚引玉。好的,今天先放點開胃菜,和大家 ...
之前因為都在忙著畢業的開題答辯與投稿論文的事宜,一直沒有時間更新這個系列的文章。看了我上一篇霧中風景的文章,師弟希望我繼續把這個系列的文章寫下去。坦白說,C++的特性很多,這也不是教學指南的文章,我會選取一些自己在學習C++過程之中值得探討的問題和大家聊一聊,拋磚引玉。好的,今天先放點開胃菜,和大家聊聊strcut與class關鍵字。
1.struct關鍵字:
在C++語言作為C語言的一個超集,是相容C語言的所有語法規則的。C語言是我學習的第一門編程語言,我自然對於其中的語法規則十分熟悉,C語言之中可以使用struct關鍵字來將基礎數據類型進行組合,實現很多類型與圖,樹等高級的數據結構。
下麵我們簡單回顧一下C語言之中的struct的用法:
struct Node { // 定義了一個樹節點
int val;
struct Node* left;
struct Node* right;
};
int main() {
struct Node root = {2,NULL,NULL}; //可以使用{a,b,c}的方式直接賦值
cout << root.val << endl;
return 0;
}
我們用了一段很簡單的代碼,就定義出了C語言之中樹的數據結構。顯然,使用struct Node作為類型定義十分冗長,我們這時候可以引出typedef這位仁兄。
typedef struct {
int val;
struct Node* left;
struct Node* right;
}Node ;
int main() {
Node root = {2,NULL,NULL}; //可以直接用Node定義類型了
cout << root.val << endl;
return 0;
}
恩,這個用法很簡單吧。一開始學習C++時,我以為這就是struct的所有用法了。但是我們不要忘了,C++可是一門面向對象的語言,C++的設計者利用了struct關鍵字添油加醋了。以下我在學習C++異常處理的部分,看到的這段代碼。
struct MyException : public exception {
const char * what () const throw () {
return "C++ Exception";
}
};
struct作為一個類來使用了,還可以繼承,還可以包含函數了。沒錯,在C++中struct關鍵字搖身一變,已經不在是C語言中的吳下阿蒙了,它幾乎和class關鍵字的效果是一樣的。唯一不同的地方在於:
- 通過struct關鍵字實現的類,屬性,函數預設的訪問許可權為public
- 通過class關鍵字實現的類,屬性,函數預設的訪問許可權為private
所以如果上面的代碼需要將關鍵字從struct改為class需要改動的內容也很簡單,就是顯式添加public的訪問許可權:
class MyException : public exception{
public:
const char * what () const throw () {
return "C++ Exception";
}
};
2.非C++語言程式員的想法:
上述struct與class的區別又是一道很好的面試題目,但是?!我不喜歡這種設計,顯然,無論在哪種情況下,顯式的指明訪問許可權才是一個好的編碼習慣,利用語言本身的規則來做的訪問控制,並不是一種十分高明的方式。
Golang
定義類的方式如下,僅有一種:type TreeNode struct { Val int Left *TreeNode Right *TreeNode }
依靠首字母的大小寫區分訪問控制,並沒有額外的坑了。
Python
定義類的方式如下,也僅有一種:class TreeNode: def __init__(self,x): self.val = x self.left = self.right = None
沒有訪問控制
Java
JAVA有很多類,枚舉類,匿名類,還有介面等關鍵字。但是沒有依靠定義類關鍵字來改變訪問控制屬性的Scala
類似於JAVA,通過伴生對象object代替了靜態類功能。總體大同小異,訪問控制靈活,也更加嚴格。
3.小結:
JAVA之父曾經說過:我遺漏了操作符重載相當個人選擇因為我見過太多的人在 C++ 濫用它。
所以Java至今也沒有支持操作符重載。(語法糖寫了一時爽,濫用之後會帶來很多團隊協作的問題)
所以今天這篇文章還是表達了一下我個人的觀點,C++之中有太多紛繁複雜的特性了,很多時候我們可能會因為一時的遍利而使用一些很不好的特性。struct就應該如同字面的內容一樣,是一個簡單使用的結構體,我們要使用類,還是拿起class關鍵字。至於對於訪問許可權,就四個字 顯式指定。