C++霧中風(fēng)景2:struct還是class?

之前因為都在忙著畢業(yè)的開題答辯與投稿論文的事宜,一直沒有時間更新這個系列的文章。師弟看了上一篇霧中風(fēng)景的文章,希望我繼續(xù)把這個系列的文章寫下去。坦白說,C++的特性很多,這也不是教學(xué)指南的文章,我會選取一些自己在學(xué)習(xí)C++過程之中值得探討的問題和大家聊一聊,來拋磚引玉。好的,今天先放點開胃菜,和大家聊聊strcut與class關(guān)鍵字。

1.struct關(guān)鍵字:

在C++語言作為C語言的一個超集,但是并不兼容C語言的所有語法規(guī)則的。C語言是我學(xué)習(xí)的第一門編程語言,相對于對其中的語法規(guī)則比較熟悉,C語言之中可以使用struct關(guān)鍵字來將基礎(chǔ)數(shù)據(jù)類型進行組合,實現(xiàn)很多類型如圖,樹等高級的數(shù)據(jù)結(jié)構(gòu)。


下面我們簡單回顧一下C語言之中的struct的用法:

struct Node {    // 定義了一個樹節(jié)點
    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語言之中樹的數(shù)據(jù)結(jié)構(gòu)。顯然,使用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;
}

恩,這個用法很簡單吧。一開始學(xué)習(xí)C++時,我天真的以為這就是struct的用法了。但是我們不要忘了,C++可是一門面向?qū)ο?/strong>的語言,C++的設(shè)計者利用了struct關(guān)鍵字添油加醋了。于是我在學(xué)習(xí)C++異常處理的部分,看到的這段代碼。

struct MyException : public exception {
  const char * what () const throw () {
    return "C++ Exception";
  }
};

struct定義的結(jié)構(gòu)是作為一個類來使用了,還可以繼承,包含函數(shù)了。沒錯,在C++中struct關(guān)鍵字搖身一變,已經(jīng)不再是C語言中的吳下阿蒙了,它幾乎和class關(guān)鍵字的效果是一樣的。唯一不同的地方在于:

  • 通過struct關(guān)鍵字實現(xiàn)的類,屬性,函數(shù)默認(rèn)的訪問權(quán)限為public
  • 通過class關(guān)鍵字實現(xiàn)的類,屬性,函數(shù)默認(rèn)的訪問權(quán)限為private

所以如果上面的代碼需要將關(guān)鍵字從struct改為class,需要改動的內(nèi)容也很簡單,就是顯式添加public的訪問權(quán)限:

class MyException : public exception{
 public:
  const char * what () const throw () {
    return "C++ Exception";
  }
};

2.非C++語言程序員的想法:

上述struct與class的區(qū)別又是一道很好的面試題目,但是?!我不喜歡這種設(shè)計,顯然,無論在何種情況下,顯式的指明訪問權(quán)限才是一個好的編碼習(xí)慣,利用語言本身的規(guī)則來做的訪問控制,并不是一種十分高明的方式。

  • Golang
    定義類的方式如下,僅有一種:
type TreeNode struct {
      Val int
      Left *TreeNode
      Right *TreeNode
  }

依靠首字母的大小寫區(qū)分訪問控制,并沒有額外的坑。

  • Python
    定義類的方式如下,也僅有一種:
class TreeNode:
    def __init__(self,x):
        self.val = x
        self.left = self.right = None

Python沒有訪問控制

  • Java
    JAVA有很多類,枚舉類,匿名類,還有接口等關(guān)鍵字。但是沒有依靠定義類關(guān)鍵字來改變訪問控制屬性的方式。

  • Scala
    類似于JAVA,通過伴生對象object代替了靜態(tài)類功能??傮w大同小異,訪問控制更加靈活,也更加嚴(yán)格。

3.小結(jié):

JAVA之父曾經(jīng)說過:我遺漏了操作符重載相當(dāng)個人選擇因為我見過太多的人在 C++ 濫用它。
所以Java至今也沒有支持操作符重載。(語法糖寫了一時爽,濫用之后會帶來很多團隊協(xié)作的問題)
所以今天這篇文章表達(dá)了一下我個人的觀點,C++之中有太多紛繁復(fù)雜的特性了,很多時候我們可能會因為一時的便利而使用了一些很不好的特性。struct就應(yīng)該如同字面的內(nèi)容一樣,是一個簡單使用的結(jié)構(gòu)體,而如果我們要使用類,還是應(yīng)該拿起class關(guān)鍵字。至于訪問權(quán)限,就四個字 顯式指定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,068評論 0 9
  • 前情提要【風(fēng)塵傳】第十一章 塵歸塵,路歸路 - 簡書:互相糾結(jié)的命運,靠什么來解開? 第十二章 今番起,意難平 ...
    哥窯閱讀 404評論 0 2
  • 再沒有兒時的喜悅 見到雪時 天空是一整片烏云 阻斷了凝望 冷風(fēng)夾雜著雪花 灌進衣領(lǐng),冰涼 記憶和天空般陰沉 雪人在...
    一個小羊羔閱讀 333評論 1 6

友情鏈接更多精彩內(nèi)容