C++結(jié)構(gòu)體struct和類class區(qū)別詳解
之前因為都在忙著畢業(yè)的開題答辯與投稿論文的事宜,一直沒有時間更新這個系列的文章。師弟看了上一篇霧中風(fēng)景的文章,希望我繼續(xù)把這個系列的文章寫下去。坦白說,C++的特性很多,這也不是教學(xué)指南的文章,我會選取一些自己在學(xué)習(xí)C++過程之中值得探討的問題和大家聊一聊,來拋磚引玉。好的,今天先放點開胃菜,和大家聊聊struct與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;
};
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è)計者利用了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)鍵字實現(xiàn)的類,屬性,函數(shù)默認的訪問權(quán)限為public
通過class關(guān)鍵字實現(xiàn)的類,屬性,函數(shù)默認的訪問權(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è)計,顯然,無論在何種情況下, 顯式的指明訪問權(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大同小異,訪問控制更加靈活,也更加嚴格。
3.小結(jié):
JAVA之父曾經(jīng)說過: 我遺漏了操作符重載相當(dāng)個人選擇因為我見過太多的人在 C++ 濫用它。
所以Java至今也沒有支持操作符重載。(語法糖寫了一時爽,濫用之后會帶來很多團隊協(xié)作的問題)
所以今天這篇文章表達了一下我個人的觀點,C++之中有太多紛繁復(fù)雜的特性了,很多時候我們可能會因為一時的便利而使用了一些很不好的特性。struct就應(yīng)該如同字面的內(nèi)容一樣,是一個簡單使用的結(jié)構(gòu)體,而如果我們要使用類,還是應(yīng)該拿起class關(guān)鍵字。至于訪問權(quán)限,就四個字 顯式指定 。
- C++中結(jié)構(gòu)體的類型定義和初始化以及變量引用
- C++動態(tài)分配和撤銷內(nèi)存以及結(jié)構(gòu)體類型作為函數(shù)參數(shù)
- C++中聲明類的class與聲明結(jié)構(gòu)體的struct關(guān)鍵字詳解
- C++結(jié)構(gòu)體與類指針知識點總結(jié)
- C++關(guān)于類結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測試詳解
- C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換
- C++結(jié)構(gòu)體與類的區(qū)別詳情
- C++?中的?JSON?序列化和反序列化及結(jié)構(gòu)體與枚舉類型的處理方法
- C++ 中類(class)和結(jié)構(gòu)體(struct)的區(qū)別
相關(guān)文章
C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
C語言程序設(shè)計譚浩強第五版課后答案(第三章習(xí)題答案)
這篇文章主要介紹了C語言程序設(shè)計譚浩強第五版課后答案(第三章習(xí)題答案),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-04-04
C語言實現(xiàn)圖書管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細介紹了C語言實現(xiàn)圖書管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
C/C++ Qt 自定義Dialog對話框組件應(yīng)用案例詳解
有時候我們需要一次性修改多個數(shù)據(jù),使用默認的模態(tài)對話框似乎不太夠用,此時我們需要自己創(chuàng)建一個自定義對話框。這篇文章主要介紹了Qt自定義Dialog對話框組件的應(yīng)用,感興趣的同學(xué)可以學(xué)習(xí)一下2021-11-11
iostream與iostream.h的區(qū)別詳細解析
以下是對C++中iostream與iostream.h的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下2013-09-09

