C++類和對象到底是什么意思

C++ 是一門面向?qū)ο蟮木幊陶Z言,理解 C++,首先要理解類(Class)和對象(Object)這兩個概念。

C++ 中的類(Class)可以看做C語言中結(jié)構(gòu)體(Struct)的升級版。結(jié)構(gòu)體是一種構(gòu)造類型,可以包含若干成員變量,每個成員變量的類型可以不同;可以通過結(jié)構(gòu)體來定義結(jié)構(gòu)體變量,每個變量擁有相同的性質(zhì)。例如:

#include <stdio.h>

//定義結(jié)構(gòu)體 Student

struct Student{

? ? //結(jié)構(gòu)體包含的成員變量

? ? char *name;

? ? int age;

? ? float score;

};

//顯示結(jié)構(gòu)體的成員變量

void display(struct Student stu){

? ? printf("%s的年齡是 %d,成績是 %f\n", stu.name, stu.age, stu.score);

}

int main(){

? ? struct Student stu1;

? ? //為結(jié)構(gòu)體的成員變量賦值

? ? stu1.name = "小明";

? ? stu1.age = 15;

? ? stu1.score = 92.5;

? ? //調(diào)用函數(shù)

? ? display(stu1);

? ? return 0;

}

運(yùn)行結(jié)果:

小明的年齡是 15,成績是 92.500000

C++ 中的類也是一種構(gòu)造類型,但是進(jìn)行了一些擴(kuò)展,類的成員不但可以是變量,還可以是函數(shù);通過類定義出來的變量也有特定的稱呼,叫做“對象”。例如:

#include <stdio.h>

//通過class關(guān)鍵字類定義類

class Student{

public:

? ? //類包含的變量

? ? char *name;

? ? int age;

? ? float score;

? ? //類包含的函數(shù)

? ? void say(){

? ? ? ? printf("%s的年齡是 %d,成績是 %f\n", name, age, score);

? ? }

};

int main(){

? ? //通過類來定義變量,即創(chuàng)建對象

? ? class Student stu1;? //也可以省略關(guān)鍵字class

? ? //為類的成員變量賦值

? ? stu1.name = "小明";

? ? stu1.age = 15;

? ? stu1.score = 92.5f;

? ? //調(diào)用類的成員函數(shù)

? ? stu1.say();

? ? return 0;

}

運(yùn)行結(jié)果與上例相同。

對于熟悉 C++ 的讀者,這段代碼并不規(guī)范,請忽略這一細(xì)節(jié),本節(jié)的重點(diǎn)是引入類和對象的概念。這套 C++ 教程是在C的基礎(chǔ)上編寫的,我并不希望一開始就提出過多的 C++ 概念,讓讀者吃不消,我希望讀者從C逐漸過渡到 C++,從第二章開始編寫規(guī)范的 C++ 代碼。也就是說,包括本節(jié)在內(nèi),第一章有很多不規(guī)范的 C++ 代碼,再次請熟悉 C++ 的讀者忽略。

class 和 public 都是 C++ 中的關(guān)鍵字,初學(xué)者請先忽略 public(后續(xù)會深入講解),把注意力集中在 class 上。

C語言中的 struct 只能包含變量,而 C++ 中的 class 除了可以包含變量,還可以包含函數(shù)。display() 是用來處理成員變量的函數(shù),在C語言中,我們將它放在了 struct Student 外面,它和成員變量是分離的;而在 C++ 中,我們將它放在了 class Student 內(nèi)部,使它和成員變量聚集在一起,看起來更像一個整體。

結(jié)構(gòu)體和類都可以看做一種由用戶自己定義的復(fù)雜數(shù)據(jù)類型,在C語言中可以通過結(jié)構(gòu)體名來定義變量,在 C++ 中可以通過類名來定義變量。不同的是,通過結(jié)構(gòu)體定義出來的變量還是叫變量,而通過類定義出來的變量有了新的名稱,叫做對象(Object)。

在第二段代碼中,我們先通過 class 關(guān)鍵字定義了一個類 Student,然后又通過 Student 類創(chuàng)建了一個對象 stu1。變量和函數(shù)都是類的成員,創(chuàng)建對象后就可以通過點(diǎn)號.來使用它們。

可以將類比喻成圖紙,對象比喻成零件,圖紙說明了零件的參數(shù)(成員變量)及其承擔(dān)的任務(wù)(成員函數(shù));一張圖紙可以生產(chǎn)出多個具有相同性質(zhì)的零件,不同圖紙可以生產(chǎn)不同類型的零件。

類只是一張圖紙,起到說明的作用,不占用內(nèi)存空間;對象才是具體的零件,要有地方來存放,才會占用內(nèi)存空間。

在 C++ 中,通過類名就可以創(chuàng)建對象,即將圖紙生產(chǎn)成零件,這個過程叫做類的實(shí)例化,因此也稱對象是類的一個實(shí)例(Instance)。

有些資料也將類的成員變量稱為屬性(Property),將類的成員函數(shù)稱為方法(Method)。

面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)

類是一個通用的概念,C++、Java、C#、PHP 等很多編程語言中都支持類,都可以通過類創(chuàng)建對象。可以將類看做是結(jié)構(gòu)體的升級版,C語言的晚輩們看到了C語言的不足,嘗試加以改善,繼承了結(jié)構(gòu)體的思想,并進(jìn)行了升級,讓程序員在開發(fā)或擴(kuò)展大中型項(xiàng)目時更加容易。

因?yàn)?C++、Java、C#、PHP 等語言都支持類和對象,所以使用這些語言編寫程序也被稱為面向?qū)ο缶幊?,這些語言也被稱為面向?qū)ο蟮木幊陶Z言。C語言因?yàn)椴恢С诸惡蛯ο蟮母拍?,被稱為面向過程的編程語言。

在C語言中,我們會把重復(fù)使用或具有某項(xiàng)功能的代碼封裝成一個函數(shù),將擁有相關(guān)功能的多個函數(shù)放在一個源文件,再提供一個對應(yīng)的頭文件,這就是一個模塊。使用模塊時,引入對應(yīng)的頭文件就可以。

而在 C++ 中,多了一層封裝,就是類(Class)。類由一組相關(guān)聯(lián)的函數(shù)、變量組成,你可以將一個類或多個類放在一個源文件,使用時引入對應(yīng)的類就可以。下面是C和C++項(xiàng)目組織方式的對比:


不要小看類(Class)這一層封裝,它有很多特性,極大地方便了中大型程序的開發(fā),它讓 C++ 成為面向?qū)ο蟮恼Z言。

面向?qū)ο缶幊淘诖a執(zhí)行效率上絕對沒有任何優(yōu)勢,它的主要目的是方便程序員組織和管理代碼,快速梳理編程思路,帶來編程思想上的革新。

面向?qū)ο缶幊淌轻槍﹂_發(fā)中大規(guī)模的程序而提出來的,目的是提高軟件開發(fā)的效率。不要把面向?qū)ο蠛兔嫦蜻^程對立起來,面向?qū)ο蠛兔嫦蜻^程不是矛盾的,而是各有用途、互為補(bǔ)充的。如果你希望開發(fā)一個貪吃蛇游戲,類和對象或許是多余的,幾個函數(shù)就可以搞定;但如果開發(fā)一款大型游戲,那你絕對離不開面向?qū)ο蟆?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了運(yùn)行時來處理。這種動態(tài)語言的...
    有一種再見叫青春閱讀 682評論 0 3
  • 萬圣節(jié),與峰哥,以及基金公司的團(tuán)隊(duì)聚餐。特別的快樂,已經(jīng)記不清有多長時間沒和峰哥這么輕松,愉快的在一起了。我講述了...
    安嶺雪豬閱讀 356評論 0 0
  • 概念 一個公司的存在,是以有利潤為前提的,只要商品的毛利乘上銷量大于這個經(jīng)營成本,這家公司就是賺錢的。 怎么做呢?...
    鐵川閱讀 750評論 0 2
  • 昨天是二十四節(jié)氣中的大寒,民間相傳這一天要吃糯米飯。所以我媽媽就做好了準(zhǔn)備,買好了做糯米飯的材料。我也沒有在...
    老3_89e2閱讀 213評論 1 1
  • 學(xué)習(xí)冥想需要注意哪些事項(xiàng)? 1) 早上起來冥想效果較好,當(dāng)然也可以按照自己的習(xí)慣來,午休和睡前都是可以的。盡量找一...
    alisonliu閱讀 86評論 0 0

友情鏈接更多精彩內(nèi)容