C結(jié)構(gòu)體势似、C++結(jié)構(gòu)體 和 C++類的定義和區(qū)別

C語言中的結(jié)構(gòu)體

一 : C語言中的結(jié)構(gòu)體

(1) C語言中的結(jié)構(gòu)體不能為空,否則會(huì)報(bào)錯(cuò)

要求一個(gè)結(jié)構(gòu)或聯(lián)合至少有一個(gè)成員

(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ū)ο缶幊潭ヌ病砜匆粋€(gè)函數(shù)指針的例子:

int FuncAdd(int a, int b)  //求和
{  
    return a + b;  
}  

struct  CTest1  
{  
    int(*Add)(int, int); //函數(shù)指針  
};  
  
int main()  
{  
    struct CTest1 test;  
    int AddResult = 0;  
    test.Add = My_FuncAdd;  
    AddResult = test.Add(8, 6);  
    printf("%d", AddResult);  
}

二 : C++語言中的結(jié)構(gòu)體

(1)第一種語法表示

struct 結(jié)構(gòu)體名稱{
???數(shù)據(jù)類型 member1余掖;
???數(shù)據(jù)類型 member2;
};
這種方式在聲明結(jié)構(gòu)體變量時(shí)為:struct 結(jié)構(gòu)體名稱 結(jié)構(gòu)體變量名

#include<stdio.h>
struct Student{
    int sNo;
    char name[10];
};
int main(){
    struct Student stu;
    scanf("%d",&stu.sNo);
    scanf("%s",stu.name);
    printf("%d\n",stu.sNo);
}
(2)第二種語法表示

typedef struct 結(jié)構(gòu)體名稱{
???數(shù)據(jù)類型 member1;
???數(shù)據(jù)類型 member2;
}結(jié)構(gòu)體名稱別名;
這種方式在聲明結(jié)構(gòu)體變量時(shí)有兩種方式礁鲁。

第一種:struct 結(jié)構(gòu)體名稱 構(gòu)體變量名
第二種:結(jié)構(gòu)體名稱別名 結(jié)構(gòu)體變量名

原因:這里使用了typedef關(guān)鍵字盐欺,此關(guān)鍵字的作用就是聲明數(shù)據(jù)類型的別名赁豆,方便用戶編程,所以這里用了之后冗美,結(jié)構(gòu)體名稱別名就相當(dāng)于struct 結(jié)構(gòu)體名稱魔种。在聲明結(jié)構(gòu)體變量時(shí),就無需寫struct了粉洼。

#include<stdio.h>
typedef struct Student{
    int sNo;
    char name[10];
}Stu;
int main(){
    struct Student stu;  //方式一
    Stu stu1;            //方式二
    scanf("%d",&stu.sNo);
    scanf("%s",stu.name);
    printf("%d\n",stu.sNo);
    scanf("%d",&stu1.sNo);
    scanf("%s",stu1.name);
    printf("%d\n",stu1.sNo);
}
(3)第三種方式

struct 結(jié)構(gòu)體名稱{
???數(shù)據(jù)類型 member1节预;
???數(shù)據(jù)類型 member2;
}結(jié)構(gòu)體變量名;

相當(dāng)于:

struct 結(jié)構(gòu)體名稱{
???數(shù)據(jù)類型 member1;
???數(shù)據(jù)類型 member2;
};
struct 結(jié)構(gòu)體名稱 結(jié)構(gòu)體變量名属韧;

這種方式既定義了結(jié)構(gòu)體名稱安拟,同時(shí)聲明了一個(gè)結(jié)構(gòu)體變量名。在其它地方也可以通過struct 結(jié)構(gòu)體來再次聲明其它變量挫剑,而第四種方法則不可以去扣。

#include<stdio.h>
struct Student{
    int sNo;
    char name[10];
}stu;      //此處stu 是變量名
int main(){
    scanf("%d",&stu.sNo);
    scanf("%s",stu.name);
    printf("%d\n",stu.sNo);
}
(4)第四種方式

struct {
???數(shù)據(jù)類型 member1;
???數(shù)據(jù)類型 member2;
}結(jié)構(gòu)體變量名;

此方式是匿名結(jié)構(gòu)體樊破,在定義時(shí)同時(shí)聲明2個(gè)結(jié)構(gòu)體變量愉棱,但不能在其它地方聲明,因?yàn)槲覀儫o法得知該結(jié)構(gòu)體的標(biāo)識(shí)符哲戚,所以就無法通過標(biāo)識(shí)符來聲明變量奔滑。

#include<stdio.h>
struct {
    int sNo;
    char name[10];
}stu,stu1;     //匿名結(jié)構(gòu)體顺少,同時(shí)定義了2個(gè)結(jié)構(gòu)體變量
int main(){
    scanf("%d",&stu.sNo);
    scanf("%s",stu.name);
    printf("%d\n",stu.sNo);
    scanf("%d",&stu1.sNo);
    scanf("%s",stu1.name);
    printf("%d\n",stu1.sNo);
}

三 : C++ 中結(jié)構(gòu)體的繼承關(guān)系

對(duì)于成員訪問權(quán)限以及繼承方式朋其,struct中是public。而class中默認(rèn)的是private脆炎,class還可以用于表示模板類型梅猿,struct則不行。

namespace std{
struct living_habit{ //生活習(xí)慣結(jié)構(gòu)體
...
};

struct animal :public living_habit {//動(dòng)物繼承生活習(xí)慣結(jié)構(gòu)體
...
 };

struct bird :public animal{ //鳥繼承動(dòng)物
...
};

}

另外namespace std{} : 稱namespace(命名空間)秒裕,在聲明一個(gè)命名空間時(shí)袱蚓,花括號(hào)內(nèi)不僅可以包括變量,而且還可以包括以下類型:
·變量(可以帶有初始化)几蜻;
·常量喇潘;
·數(shù)(可以是定義或聲明);
·結(jié)構(gòu)體梭稚;
·類颖低;
·模板;

四 : C++類的定義和實(shí)現(xiàn)

(1):定義(默認(rèn)的是private):
class 類名  
{  
    public:  
        //公共的行為或?qū)傩? 

    private:  
        //公共的行為或?qū)傩? 
}; 
(2):實(shí)現(xiàn)

兩種方式:一種類內(nèi) 實(shí)現(xiàn)(setPoint),另外一種是在類內(nèi)對(duì)成員函數(shù)進(jìn)行聲明 ,類外實(shí)現(xiàn)(setPoint2)

    #include <iostream>  
    using namespace std;  
    class Point  
    {  
        public:  
            void setPoint(int x, int y) //類內(nèi) 實(shí)現(xiàn)setPoint函數(shù)  
            {  
                xPos = x;  
                yPos = y;  
            }  
      
          void setPoint2(int x, int y); //在類內(nèi)對(duì)成員函數(shù)進(jìn)行聲明  ,類外實(shí)現(xiàn)

            void printPoint()       //實(shí)現(xiàn)printPoint函數(shù)  
            {  
                cout<< "x = " << xPos << endl;  
                cout<< "y = " << yPos << endl;  
            }  
      
        private:  
            int xPos;  
            int yPos;  
    };  
      
   void Point2::setPoint(int x, int y) //通過作用域操作符 '::' 實(shí)現(xiàn)setPoint函數(shù)  
     {  
       xPos = x;  
       yPos = y;  
    }  

    int main()  
    {  
        Point M;        //用定義好的類創(chuàng)建一個(gè)對(duì)象 點(diǎn)M  
        M.setPoint(10, 20); //設(shè)置 M點(diǎn) 的x,y值  
       //M.setPoint2(10, 20); //設(shè)置 M點(diǎn) 的x,y值  

        M.printPoint();     //輸出 M點(diǎn) 的信息  
      
        return 0;  
    }  

概念:class和struct的語法基本相同弧烤,從聲明到使用忱屑,都很相似,但是struct的約束要比class多,理論上莺戒,struct能做到的class都能做到粱栖,但class能做到的stuct卻不一定做的到。
類型:struct是值類型脏毯,class是引用類型,因此它們具有所有值類型和引用類型之間的差異幔崖。
效率:由于堆棧的執(zhí)行效率要比堆的執(zhí)行效率高食店,但是堆棧資源卻很有限,不適合處理邏輯復(fù)雜的大對(duì)象赏寇,因此struct常用來處理作為基類型對(duì)待的小對(duì)象吉嫩,而class來處理某個(gè)商業(yè)邏輯。
關(guān)系:struct不僅能繼承也能被繼承 嗅定,而且可以實(shí)現(xiàn)接口自娩,不過Class可以完全擴(kuò)展。內(nèi)部結(jié)構(gòu)有區(qū)別渠退,struct只能添加帶參的構(gòu)造函數(shù)忙迁,不能使用abstract和protected等修飾符,不能初始化實(shí)例字段碎乃。

注(本文作為隨筆方便自己以后查看,轉(zhuǎn)載請(qǐng)附以下參考鏈接):
http://blog.csdn.net/dawn_after_dark/article/details/73555562
http://blog.csdn.net/Loving_Forever_/article/details/51483828

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姊扔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梅誓,更是在濱河造成了極大的恐慌恰梢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗掰,死亡現(xiàn)場(chǎng)離奇詭異嵌言,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)及穗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摧茴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拥坛,你說我怎么就攤上這事蓬蝶。” “怎么了猜惋?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵丸氛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我著摔,道長(zhǎng)缓窜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮禾锤,結(jié)果婚禮上私股,老公的妹妹穿的比我還像新娘。我一直安慰自己恩掷,他們只是感情好倡鲸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黄娘,像睡著了一般峭状。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逼争,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天优床,我揣著相機(jī)與錄音,去河邊找鬼誓焦。 笑死胆敞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杂伟。 我是一名探鬼主播移层,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赫粥!你這毒婦竟也來了幽钢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤傅是,失蹤者是張志新(化名)和其女友劉穎匪燕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喧笔,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帽驯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了书闸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尼变。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浆劲,靈堂內(nèi)的尸體忽然破棺而出嫌术,到底是詐尸還是另有隱情,我是刑警寧澤牌借,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布度气,位于F島的核電站,受9級(jí)特大地震影響膨报,放射性物質(zhì)發(fā)生泄漏磷籍。R本人自食惡果不足惜适荣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望院领。 院中可真熱鬧弛矛,春花似錦、人聲如沸比然。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)强法。三九已至扒寄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拟烫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工迄本, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硕淑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓嘉赎,卻偏偏與公主長(zhǎng)得像置媳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子公条,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容