C++結(jié)構(gòu)體struct和類class區(qū)別詳解
之前因?yàn)槎荚诿χ厴I(yè)的開題答辯與投稿論文的事宜,一直沒(méi)有時(shí)間更新這個(gè)系列的文章。師弟看了上一篇霧中風(fēng)景的文章,希望我繼續(xù)把這個(gè)系列的文章寫下去。坦白說(shuō),C++的特性很多,這也不是教學(xué)指南的文章,我會(huì)選取一些自己在學(xué)習(xí)C++過(guò)程之中值得探討的問(wèn)題和大家聊一聊,來(lái)拋磚引玉。好的,今天先放點(diǎn)開胃菜,和大家聊聊struct與class關(guān)鍵字。
1.struct關(guān)鍵字:
在C++語(yǔ)言作為C語(yǔ)言的一個(gè)超集,是兼容C語(yǔ)言的所有語(yǔ)法規(guī)則的。C語(yǔ)言是我學(xué)習(xí)的第一門編程語(yǔ)言,我自然對(duì)于其中的語(yǔ)法規(guī)則十分熟悉,C語(yǔ)言之中可以使用struct關(guān)鍵字來(lái)將基礎(chǔ)數(shù)據(jù)類型進(jìn)行組合,實(shí)現(xiàn)很多類型如圖,樹等高級(jí)的數(shù)據(jù)結(jié)構(gòu)。
下面我們簡(jiǎn)單回顧一下C語(yǔ)言之中的struct的用法:
struct Node { // 定義了一個(gè)樹節(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; }
我們用了一段很簡(jiǎn)單的代碼,就定義出了C語(yǔ)言之中樹的數(shù)據(jù)結(jié)構(gòu)。顯然,使用struct Node作為類型定義十分冗長(zhǎng),我們這時(shí)候可以引出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; }
恩,這個(gè)用法很簡(jiǎn)單吧。一開始學(xué)習(xí)C++時(shí),我天真的以為這就是struct的用法了。但是我們不要忘了,C++可是一門 面向?qū)ο?的語(yǔ)言,C++的設(shè)計(jì)者利用了struct關(guān)鍵字添油加醋了。于是我在學(xué)習(xí)C++異常處理的部分,看到的這段代碼。
struct MyException : public exception { const char * what () constthrow () { return "C++ Exception"; } };
struct定義的結(jié)構(gòu)是作為一個(gè)類來(lái)使用了,還可以繼承,包含函數(shù)了。沒(méi)錯(cuò),在C++中struct關(guān)鍵字搖身一變,已經(jīng)不再是C語(yǔ)言中的吳下阿蒙了,它幾乎和class關(guān)鍵字的效果是一樣的。唯一不同的地方在于:
通過(guò)struct關(guān)鍵字實(shí)現(xiàn)的類,屬性,函數(shù)默認(rèn)的訪問(wèn)權(quán)限為public
通過(guò)class關(guān)鍵字實(shí)現(xiàn)的類,屬性,函數(shù)默認(rèn)的訪問(wèn)權(quán)限為private
所以如果上面的代碼需要將關(guān)鍵字從struct改為class,需要改動(dòng)的內(nèi)容也很簡(jiǎn)單,就是顯式添加public的訪問(wèn)權(quán)限:
class MyException : public exception{ public: const char * what () constthrow () { return "C++ Exception"; } };
2.非C++語(yǔ)言程序員的想法:
上述struct與class的區(qū)別又是一道很好的面試題目,但是?!我不喜歡這種設(shè)計(jì),顯然,無(wú)論在何種情況下, 顯式的指明訪問(wèn)權(quán)限 才是一個(gè)好的編碼習(xí)慣,利用語(yǔ)言本身的規(guī)則來(lái)做的訪問(wèn)控制,并不是一種十分高明的方式。
Golang
定義類的方式如下,僅有一種:
type TreeNode struct { Val int Left *TreeNode Right *TreeNode }
依靠首字母的大小寫區(qū)分訪問(wèn)控制,并沒(méi)有額外的坑。
Python
定義類的方式如下,也僅有一種:
class TreeNode: def__init__(self,x): self.val = x self.left = self.right = None
Python沒(méi)有訪問(wèn)控制
Java
JAVA有很多類,枚舉類,匿名類,還有接口等關(guān)鍵字。但是沒(méi)有依靠定義類關(guān)鍵字來(lái)改變?cè)L問(wèn)控制屬性的方式。
Scala
類似于JAVA,通過(guò)伴生對(duì)象object代替了靜態(tài)類功能。總體大同小異,訪問(wèn)控制更加靈活,也更加嚴(yán)格。
3.小結(jié):
JAVA之父曾經(jīng)說(shuō)過(guò): 我遺漏了操作符重載相當(dāng)個(gè)人選擇因?yàn)槲乙娺^(guò)太多的人在 C++ 濫用它。
所以Java至今也沒(méi)有支持操作符重載。(語(yǔ)法糖寫了一時(shí)爽,濫用之后會(huì)帶來(lái)很多團(tuán)隊(duì)協(xié)作的問(wèn)題)
所以今天這篇文章表達(dá)了一下我個(gè)人的觀點(diǎn),C++之中有太多紛繁復(fù)雜的特性了,很多時(shí)候我們可能會(huì)因?yàn)橐粫r(shí)的便利而使用了一些很不好的特性。struct就應(yīng)該如同字面的內(nèi)容一樣,是一個(gè)簡(jiǎn)單使用的結(jié)構(gòu)體,而如果我們要使用類,還是應(yīng)該拿起class關(guān)鍵字。至于訪問(wèn)權(quán)限,就四個(gè)字 顯式指定 。
上一篇:獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例
欄 目:C語(yǔ)言
下一篇:C/C++利用libxml2高效輸出XML大文件詳解
本文標(biāo)題:C++結(jié)構(gòu)體struct和類class區(qū)別詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1043.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問(wèn)題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery