欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++結構體struct和類class區(qū)別詳解

 更新時間:2017年11月15日 08:45:10   作者:happenlee  
struct和class有什么區(qū)別?最本質的一個區(qū)別就是默認的訪問控制:默認的繼承訪問權限,struct是public的,class是private的。

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

1.struct關鍵字:

在C++語言作為C語言的一個超集,是兼容C語言的所有語法規(guī)則的。C語言是我學習的第一門編程語言,我自然對于其中的語法規(guī)則十分熟悉,C語言之中可以使用struct關鍵字來將基礎數據類型進行組合,實現很多類型如圖,樹等高級的數據結構。

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

struct Node { // 定義了一個樹節(jié)點
 int val;
 struct Node* left;
 struct Node* right;
};

intmain() {
 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 ;

intmain() {
 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 () constthrow () {
 return "C++ Exception";
 }
};

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

通過struct關鍵字實現的類,屬性,函數默認的訪問權限為public
通過class關鍵字實現的類,屬性,函數默認的訪問權限為private
所以如果上面的代碼需要將關鍵字從struct改為class,需要改動的內容也很簡單,就是顯式添加public的訪問權限:

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

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

上述struct與class的區(qū)別又是一道很好的面試題目,但是?!我不喜歡這種設計,顯然,無論在何種情況下, 顯式的指明訪問權限 才是一個好的編碼習慣,利用語言本身的規(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有很多類,枚舉類,匿名類,還有接口等關鍵字。但是沒有依靠定義類關鍵字來改變訪問控制屬性的方式。

Scala

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

3.小結:

JAVA之父曾經說過: 我遺漏了操作符重載相當個人選擇因為我見過太多的人在 C++ 濫用它。

所以Java至今也沒有支持操作符重載。(語法糖寫了一時爽,濫用之后會帶來很多團隊協作的問題)

所以今天這篇文章表達了一下我個人的觀點,C++之中有太多紛繁復雜的特性了,很多時候我們可能會因為一時的便利而使用了一些很不好的特性。struct就應該如同字面的內容一樣,是一個簡單使用的結構體,而如果我們要使用類,還是應該拿起class關鍵字。至于訪問權限,就四個字 顯式指定 。

相關文章

  • win32使用openfilename瀏覽文件窗口示例

    win32使用openfilename瀏覽文件窗口示例

    這篇文章主要介紹了使用win32 API打開瀏覽文件窗口,使用OPENFILENAME結構體來實現這個功能,需要的朋友可以參考下
    2014-02-02
  • c語言的注釋定界符詳解

    c語言的注釋定界符詳解

    在本文里小編給大家分享的是關于c語言的注釋定界符知識點詳解,需要的朋友們可以跟著學習下。
    2020-02-02
  • Vc++ 控件List Control用法總結

    Vc++ 控件List Control用法總結

    這篇文章主要介紹了Vc++ 控件List Control用法總結的相關資料,需要的朋友可以參考下
    2015-06-06
  • C語言利用結構體數組實現學生成績管理系統(tǒng)

    C語言利用結構體數組實現學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言利用結構體數組實現學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 實現一個內存池管理的類方法

    實現一個內存池管理的類方法

    下面小編就為大家?guī)硪黄獙崿F一個內存池管理的類方法。小編覺得挺不錯的現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C語言程序設計譚浩強第五版課后答案(第三章習題答案)

    C語言程序設計譚浩強第五版課后答案(第三章習題答案)

    這篇文章主要介紹了C語言程序設計譚浩強第五版課后答案(第三章習題答案),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-04-04
  • C語言詳細分析講解struct與union使用方法

    C語言詳細分析講解struct與union使用方法

    最近開始自學C語言,從最基礎部分的開始學起。今天看書的時候注意到了struct和union似乎很像,除了名字不同,看起來幾乎沒有區(qū)別。<BR>既然C中定義了struct和union兩個關鍵字,那么它們肯定是有區(qū)別的,在查了一些資料之后我來總結一下他們的使用
    2022-04-04
  • C語言實現圖書管理系統(tǒng)課程設計

    C語言實現圖書管理系統(tǒng)課程設計

    這篇文章主要為大家詳細介紹了C語言實現圖書管理系統(tǒng)課程設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C/C++ Qt 自定義Dialog對話框組件應用案例詳解

    C/C++ Qt 自定義Dialog對話框組件應用案例詳解

    有時候我們需要一次性修改多個數據,使用默認的模態(tài)對話框似乎不太夠用,此時我們需要自己創(chuàng)建一個自定義對話框。這篇文章主要介紹了Qt自定義Dialog對話框組件的應用,感興趣的同學可以學習一下
    2021-11-11
  • iostream與iostream.h的區(qū)別詳細解析

    iostream與iostream.h的區(qū)別詳細解析

    以下是對C++中iostream與iostream.h的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09

最新評論