最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++結(jié)構(gòu)體struct和類class區(qū)別詳解

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

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

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

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

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

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

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

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

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

通過struct關(guān)鍵字實(shí)現(xiàn)的類,屬性,函數(shù)默認(rèn)的訪問權(quán)限為public
通過class關(guān)鍵字實(shí)現(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 () constthrow () {
 return "C++ Exception";
 }
};

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

上述struct與class的區(qū)別又是一道很好的面試題目,但是?!我不喜歡這種設(shè)計(jì),顯然,無論在何種情況下, 顯式的指明訪問權(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)個人選擇因?yàn)槲乙娺^太多的人在 C++ 濫用它。

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

所以今天這篇文章表達(dá)了一下我個人的觀點(diǎn),C++之中有太多紛繁復(fù)雜的特性了,很多時候我們可能會因?yàn)橐粫r的便利而使用了一些很不好的特性。struct就應(yīng)該如同字面的內(nèi)容一樣,是一個簡單使用的結(jié)構(gòu)體,而如果我們要使用類,還是應(yīng)該拿起class關(guān)鍵字。至于訪問權(quán)限,就四個字 顯式指定 。

相關(guān)文章

  • Qt實(shí)現(xiàn)TCP同步與異步讀寫消息的示例代碼

    Qt實(shí)現(xiàn)TCP同步與異步讀寫消息的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何在?Qt?中實(shí)現(xiàn)?TCP?客戶端和服務(wù)器的同步和異步讀寫消息,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Qt中簡單的按鈕槽函數(shù)傳遞參數(shù)方法

    Qt中簡單的按鈕槽函數(shù)傳遞參數(shù)方法

    這篇文章主要介紹了Qt中簡單的按鈕槽函數(shù)傳遞參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • QT實(shí)現(xiàn)秒表項(xiàng)目

    QT實(shí)現(xiàn)秒表項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)秒表項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 深入淺析C++的new和delete

    深入淺析C++的new和delete

    new和delete既是C++中的關(guān)鍵字也是一種特殊的運(yùn)算符。這篇文章主要介紹了C++的new和delete詳解,需要的朋友可以參考下
    2018-02-02
  • 枚舉窗口句柄后關(guān)閉所有窗口示例

    枚舉窗口句柄后關(guān)閉所有窗口示例

    這篇文章主要介紹了關(guān)閉所有窗口的方法,原理是枚舉所有窗口句柄,然后發(fā)送WM_CLOSE消息來關(guān)閉窗口,需要的朋友可以參考下
    2014-01-01
  • C及C++?基礎(chǔ)循環(huán)示例詳解

    C及C++?基礎(chǔ)循環(huán)示例詳解

    這篇文章主要介紹了C及C++?中的循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 基于Qt編寫全能播放組件的示例代碼

    基于Qt編寫全能播放組件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt編寫全能播放組件,可以支持ffmpeg2/3/4/5/6/Qt4/5/6,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • C++的虛析構(gòu)詳解及實(shí)例代碼

    C++的虛析構(gòu)詳解及實(shí)例代碼

    這篇文章主要介紹了C++的虛析構(gòu)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言實(shí)現(xiàn)維吉尼亞密碼的示例代碼

    C語言實(shí)現(xiàn)維吉尼亞密碼的示例代碼

    維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬于多表密碼的一種簡單形式。本文將用C語言實(shí)現(xiàn)維吉尼亞密碼,需要的可以參考一下
    2022-11-11
  • 深入理解C語言的void*

    深入理解C語言的void*

    本文主要介紹了C語言的void*,包括它的任意性、編譯器對void*的類型檢查以及需要顯式類型轉(zhuǎn)換的規(guī)則,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01

最新評論

新营市| 铜山县| 老河口市| 双辽市| 焉耆| 英吉沙县| 隆林| 谢通门县| 尚志市| 柏乡县| 麻江县| 武安市| 呈贡县| 乐清市| 收藏| 奉节县| 安陆市| 冀州市| 焉耆| 宣化县| 沾益县| 鸡西市| 昆明市| 兴城市| 达州市| 辽阳县| 确山县| 岐山县| 包头市| 凭祥市| 芦溪县| 贺州市| 镇赉县| 垦利县| 潮州市| 海晏县| 神池县| 铁力市| 龙口市| 舞钢市| 石首市|