c 中的類與物件

2021-08-18 21:33:44 字數 3682 閱讀 7939

我們都知道,在c語言中,結構體是指一系列相同型別或者不同型別的資料構成的資料集合。

在c語言中我們將結構體定義為:

struct student

;

而我們知道,在c語言中,「資料」和」處理資料的操作(函式)」是分開的,語言本身並沒有支援「資料和函式」之間的關聯性。所以在c語言的結構體中,只能存放資料,定義變數,而不能定義函式。(此處不考慮定義乙個指向函式的指標)

而在c++中,結構體內不僅可以定義變數,還可以定義函式。

struct student

};int main()

c語言中的struct與c++中的struct有什麼區別

c語言中的struct只能儲存資料,定義變數,不能定義函式 

c++中的struct可以定義變數或者函式

而在c++中,結構體的定義更喜歡用class來代替,我們稱之為「類」。

1.類的概念及封裝

類的定義:

class

classname

說明:

class是定義類的關鍵字;classname是類名,{}內是類的主體;類定義結束時後面要加上分號。

類中的元素稱為類的成員;類中的資料稱之為類的屬性或者類的成員變數;類中的函式稱之為類的方法或者類的成員函式。

類的定義有兩種方式:

1.類的宣告和定義都放在類體中

class test

~test()

};

2.類的宣告放在.h檔案中,類的定義放在.cpp檔案中

*test.h*

class test

;

*test.cpp*

test::test ()

test::~test()

c++中struct和class的區別

關於預設訪問許可權: 

class預設成員訪問許可權為private;而struct預設成員訪問許可權為public

關於繼承方式:

class繼承預設為private;而struct繼承預設為public繼承

class這個關鍵字還用於定義模板引數,就像typename。但關鍵字struct不用於定義模板引數。

封裝:c++的三種特徵:封裝,繼承,多型

什麼是封裝:

隱藏物件的屬性及實現細節,僅對外公開介面和物件進行互動,將資料和運算元據的方法進行有機結合。

示例:1.就比如說電腦,在電腦中有主機板,cpu,網絡卡,記憶體等等,但是所有複雜的結構外裝上乙個機箱的外衣,當使用者使用電腦時,不用知道電腦其內部結構,只用通過鍵盤輸入,即可完成自己想要的操作。

2.函式也是一種封裝,函式中的語句被封裝在函式這個更大的實體中,被封裝的實體隱藏了它們的實現細節,可以呼叫函式,但是不能訪問其內部。

類的意義:

類是把屬性和方法進行封裝,同時對類的屬性和方法進行訪問控制。 

類是由我們根據客觀事物抽象而成,形成一類事物,然後用類去定義物件,形成這類事物的具體個體。

類是乙個資料型別,類是抽象的,而物件是乙個具體的變數,是占用記憶體空間的。

類的作用域:在c++中,我們已經學會了三種作用域–全域性作用域,區域性作用域,命名空間域,而類定義了乙個新的作用域,類的所有成員必須處於類的作用域中。形參表和函式體位於類的作用域中。

花括號以外稱為類外,在類外定義成員必須使用」: :」作用域解析符指明成員屬於哪乙個類作用域;在類的作用域外,只能通過物件借助成員訪問操作符「.」和」->」來訪問類成員,跟在訪問操作符之後的名字必須在相關聯類的作用域裡。

class test

void printa()

private:

int _a;

};int main()

在此,我們已經學到了c++中的四種作用域—全域性作用域,區域性作用域,命名空間域以及類作用域。

注意:成員變數在類的作用域中具有全域性作用性。

在使用乙個變數前,必須先對其宣告,但是咋上述test類中,成員變數在函式之後,為什麼編譯器不報錯?

這和編譯器對類的識別有關,在編譯器識別類時,順序如下:

(1)識別類的類名

(2)識別類中的成員變數

(3)識別類的成員函式,並且對成員函式進行修改

因此變數定義在使用之後編譯器也不會報告出錯。

類的例項化:

用類型別建立物件的過程稱之為類的例項化。

說明:

1.類知識乙個相當於模型一樣的東西,只是限定了類有哪些成員,定義乙個類,並沒有分配實際的記憶體空間來儲存它。

2.乙個類可以例項化多個物件,例項化出來的物件占用實際的物理空間儲存類成員變數。

物件:

類是物件的抽象,物件是類的具體例項。

類是抽象的,不占用記憶體,而物件是具體的,占有記憶體空間。

例如:類就是水果,物件就是蘋果。

類的物件模型:

類的物件模型是指類中各成員在記憶體中的布局形式

類中既有成員變數,又有成員函式,那麼如何計算類的大小呢?(嚴格來說是類的物件的大小,因為類是乙個型別定義,沒有大小可言)

class person

void printperson()

private:

char _name[20];

char _gender[3];

int _age;

};int main()

對於上述**,其執行結果為:

結論:乙個類的大小就是類中「成員變數」之和。

對於乙個空類,它的大小又是多少呢?

class

emptyclass

{};int main()

執行結果:

故我們可知,空類的大小是1。

(此處所說的是vs2013編譯器下的結果,編譯器不一樣,空類大小不一樣)

原因:這就是我們剛才所說的例項化的原因(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址。

換句話說 c++編譯器不允許物件為零長度。試想乙個長度為0的物件在記憶體中怎麼存放?怎麼獲取它的位址?為了避免這種情況,c++強制給這種類插入乙個預設成員,長度為1。如果有自定義的變數,變數將取代這個預設成員。

C 中的類與物件

什麼是類與物件?類是一種抽象化的資料型別,一般而言,它包括資料與處理資料的函式這兩大部分。而物件則是對某一類的例項。例如 class cmyclass cmyclass為類 cmyclass myclass myclass為物件1.類的定義與特點 類的定義示例如下 class cmyclass 各個...

C 類與物件(中)

類六個預設函式包括構造 拷貝構造 析構 賦值運算子過載 取位址操作符過載 const修飾的取位址操作符過載,預設生成 建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員 都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次 特性如下 1.函式名與類名...

C 類與物件(中)

類與物件 上 對類的定義 類的作用域 類的物件模型 this指標等進行了相關介紹,下面我們將對類的6個預設成員函式進行詳細的介紹 2.1 建構函式的定義 建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼...