C++中結(jié)構(gòu)體與類(lèi)的使用區(qū)別及說(shuō)明
在參與以C++為編程基礎(chǔ)的項(xiàng)目應(yīng)用中總會(huì)遇到結(jié)構(gòu)體類(lèi)型與類(lèi)的數(shù)據(jù)類(lèi)型,但是其具體應(yīng)用區(qū)別模糊不清
現(xiàn)將其區(qū)別總結(jié)如下(先介紹C和C++中結(jié)構(gòu)體的不同,再對(duì)比C++中結(jié)構(gòu)體與類(lèi)的區(qū)別)
一、C和C++中結(jié)構(gòu)體的不同
(1)C語(yǔ)言中的結(jié)構(gòu)體不能為空,否則會(huì)報(bào)錯(cuò)
C語(yǔ)言中要求一個(gè)結(jié)構(gòu)或聯(lián)合至少有一個(gè)成員。C語(yǔ)言中,空結(jié)構(gòu)體的大小為0,而C++中空結(jié)構(gòu)體(屬于空類(lèi))的大小為1
(2)C語(yǔ)言中的結(jié)構(gòu)體只涉及到數(shù)據(jù)結(jié)構(gòu),而不涉及到算法
在C語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)和算法是分離的。換句話說(shuō)就是C語(yǔ)言中的結(jié)構(gòu)體只能定義成員變量,但是不能定義成員函數(shù)
然而在C++中既可以定義成員變量又可以定義成員函數(shù), C++中的結(jié)構(gòu)體和類(lèi)體現(xiàn)了數(shù)據(jù)結(jié)構(gòu)和算法的結(jié)合
不過(guò)雖然C語(yǔ)言的結(jié)構(gòu)體中不能定義成員函數(shù),但是卻可以定義函數(shù)指針,不過(guò)函數(shù)指針本質(zhì)上不是函數(shù)而是指針,所以總的來(lái)說(shuō)C語(yǔ)言中的結(jié)構(gòu)體只是一個(gè)復(fù)雜數(shù)據(jù)類(lèi)型 ,只能定義成員變量,不能定義成員函數(shù),不能用于面向?qū)ο缶幊?/p>
(3)C語(yǔ)言中定義結(jié)構(gòu)變量時(shí)不可省略struct關(guān)鍵字,C++可以省略
在C語(yǔ)言中使用struct定義的結(jié)構(gòu)體中在定義變量的時(shí)候,struct不能省略
但是在C++之中則可以省略struct
二、C++中結(jié)構(gòu)體與類(lèi)的區(qū)別
C++中的struct對(duì)C中的struct進(jìn)行了擴(kuò)充,它已經(jīng)不再只是一個(gè)包含不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)結(jié)構(gòu)了,它已經(jīng)獲取了太多的功能
- struct能包含成員函數(shù)嗎? 能!
- struct能繼承嗎? 能!!
- struct能實(shí)現(xiàn)多態(tài)嗎? 能!??!
既然這些它都能實(shí)現(xiàn),那它和class還能有什么區(qū)別?
最本質(zhì)的一個(gè)區(qū)別就是默認(rèn)的訪問(wèn)控制:
默認(rèn)的繼承訪問(wèn)權(quán)限:struct是public的,class是private的
C++中,不使用結(jié)構(gòu)體絲毫不會(huì)影響程序的表達(dá)能力。C++之所以要引入結(jié)構(gòu)體,是為了保持和C程序的兼容性
但有時(shí)仍會(huì)在C++中使用結(jié)構(gòu)體,是因?yàn)榭梢允褂媒Y(jié)構(gòu)體將不同類(lèi)型數(shù)據(jù)組成整體,方便于保存數(shù)據(jù)(若用類(lèi)來(lái)保存,因類(lèi)中成員默認(rèn)為私有,還要為每個(gè)數(shù)據(jù)成員特定函數(shù)來(lái)讀取和改寫(xiě)各個(gè)屬性,比較麻煩)
struct可以繼承class,同樣class也可以繼承struct
struct是一種數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)體,雖然它是可以像class一樣的用。我依舊將struct里的變量叫數(shù)據(jù),class內(nèi)的變量叫成員,雖然它們并無(wú)區(qū)別
三、總結(jié)
- 概念:class和struct的語(yǔ)法基本相同,從聲明到使用,都很相似,但是struct的約束要比class多,理論上,struct能做到的class都能做到,但class能做到的stuct卻不一定做的到
- 類(lèi)型:struct是值類(lèi)型,class是引用類(lèi)型,因此它們具有所有值類(lèi)型和引用類(lèi)型之間的差異
- 效率:由于堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,但是堆棧資源卻很有限,不適合處理邏輯復(fù)雜的大對(duì)象,因此struct常用來(lái)處理作為基類(lèi)型對(duì)待的小對(duì)象,而class來(lái)處理某個(gè)商業(yè)邏輯
- 關(guān)系:struct不僅能繼承也能被繼承 ,而且可以實(shí)現(xiàn)接口,不過(guò)Class可以完全擴(kuò)展。內(nèi)部結(jié)構(gòu)有區(qū)別,struct只能添加帶參的構(gòu)造函數(shù),不能使用abstract和protected等修飾符,不能初始化實(shí)例字段
牛人總結(jié):
(1) 在表示諸如點(diǎn)、矩形等主要用來(lái)存儲(chǔ)數(shù)據(jù)的輕量級(jí)對(duì)象時(shí),首選struct
(2) 在表示數(shù)據(jù)量大、邏輯復(fù)雜的大對(duì)象時(shí),首選class
(3) 在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),class是最佳選擇
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++讀取數(shù)據(jù)文件到數(shù)組的實(shí)例
今天小編就為大家分享一篇c++讀取數(shù)據(jù)文件到數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Cocos2d-x中使用CCScrollView來(lái)實(shí)現(xiàn)關(guān)卡選擇實(shí)例
這篇文章主要介紹了Cocos2d-x中使用CCScrollView來(lái)實(shí)現(xiàn)關(guān)卡的選擇實(shí)例,本文在代碼中用大量注釋講解了CCScrollView的使用,需要的朋友可以參考下2014-09-09
Qt中使用正則表達(dá)式來(lái)提取字符串等操作指南
在Qt中使用正則表達(dá)式提取字符串是一個(gè)常見(jiàn)的任務(wù),下面這篇文章主要介紹了Qt中使用正則表達(dá)式來(lái)提取字符串等操作的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
C 語(yǔ)言基礎(chǔ)之初識(shí) C 語(yǔ)言常量
C語(yǔ)言中的常量分為以下幾種:字面常量、const修飾的常變量、#define定義的標(biāo)識(shí)符常量等,下面我們將詳細(xì)對(duì)C語(yǔ)言這幾個(gè)常量做介紹,感興趣的小伙伴可以參考一下2021-09-09
C++結(jié)構(gòu)體struct和類(lèi)class區(qū)別詳解
struct和class有什么區(qū)別?最本質(zhì)的一個(gè)區(qū)別就是默認(rèn)的訪問(wèn)控制:默認(rèn)的繼承訪問(wèn)權(quán)限,struct是public的,class是private的。2017-11-11
Linux下實(shí)現(xiàn)C++操作Mysql數(shù)據(jù)庫(kù)
由于工作需要抽出一周的時(shí)間來(lái)研究C/C++訪問(wèn)各種數(shù)據(jù)庫(kù)的方法,并打算封裝一套數(shù)據(jù)庫(kù)操作類(lèi),現(xiàn)在奉上最簡(jiǎn)單的一部分:在Linux下訪問(wèn)MySQL數(shù)據(jù)庫(kù)。2017-05-05
C語(yǔ)言行優(yōu)先和列優(yōu)先的問(wèn)題深入分析
這篇文章主要介紹了C語(yǔ)言行優(yōu)先和列優(yōu)先的問(wèn)題深入分析的相關(guān)資料,需要的朋友可以參考下2017-01-01

