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

