C++霧中風景2:struct還是class?

来源:http://www.cnblogs.com/happenlee/archive/2017/11/12/7820898.html
-Advertisement-
Play Games

之前因為都在忙著畢業的開題答辯與投稿論文的事宜,一直沒有時間更新這個系列的文章。看了我上一篇霧中風景的文章,師弟希望我繼續把這個系列的文章寫下去。坦白說,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關鍵字。至於對於訪問許可權,就四個字 顯式指定


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 #include <sys/types.h> 2 #include <sys/socket.h> 3 #include <sys/epoll.h> 4 #include <netdb.h> 5 #include <string.h> 6 #include <stdio.h> 7 #include ...
  • Tomcat配置 1.官網下載Tomcat配置包:http://tomcat.apache.org/download-70.cgi 2.下載之後,將解壓後的的整個文件夾重新命名:ApacheTomcat(這個名字隨便起),然後放在一個文件目錄下,我把它放在了:/Users/電腦用戶名/Library ...
  • 題目內容: 你的程式要讀入一行文本,其中以空格分隔為若幹個單詞,以‘.’結束。你要輸出這行文本中每個單詞的長度。這裡的單詞與語言無關,可以包括各種符號,比如“it's”算一個單詞,長度為4。註意,行中可能出現連續的空格。 輸入格式: 輸入在一行中給出一行文本,以‘.’結束,結尾的句號不能計算在最後一 ...
  • 題目內容: 由於電腦內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就需要自己設計實現方法。 (0,1)之間的任何浮點數都可以表達為兩個正整數的商,為了表達這樣兩個數的商,可以將相除的結果以多個整數來表示,每個整數表示結果的一位。即商的第一位用一個整數來表示,第二位用另一個整數 ...
  • 題目內容: 你的程式要讀入一個整數,範圍是[-100000,100000]。然後,用漢語拼音將這個整數的每一位輸出出來。 如輸入1234,則輸出: yi er san si 註意,每個字的拼音之間有一個空格,但是最後的字後面沒有空格。當遇到負數時,在輸出的開頭加上“fu”,如-2341輸出為: fu ...
  • 題目內容 對數字求特征值是常用的編碼演算法,奇偶特征是一種簡單的特征值。對於一個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下一個1,否則記下一個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄下來,就形成了一個二 ...
  • 奇偶個數 奇偶個數 題目內容: 你的程式要讀入一系列正整數數據,輸入-1表示輸入結束,-1本身不是輸入的數據。程式輸出讀到的數據中的奇數和偶數的個數。 輸入格式: 一系列正整數,整數的範圍是(0,100000)。如果輸入-1則表示輸入結束。 輸出格式: 兩個整數,第一個整數表示讀入數據中的奇數的個數 ...
  • 時間換算 時間換算 題目內容: UTC是世界協調時,BJT是北京時間,UTC時間相當於BJT減去8。現在,你的程式要讀入一個整數,表示BJT的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...