C 之結構體與類

2021-08-31 13:28:13 字數 3692 閱讀 4903

結構體與類的區別

總結在c語言中,我們經常定義結構體來作為資料結構,而c++也支援定義結構體。c++中的結構體與c語言中的結構體主要有以下幾點區別:

1.c語言需要使用struct structnme來定義結構體,而c++可以直接用structname來定義結構體名。(c語言可通過typedef來為結構體取別名)

#include

using

namespace std;

struct point

;int

main()

2.c語言中不能初始化結構體成員,而c++中可以

#include

using

namespace std;

struct point

;int

main()

1
3.c語言中結構體不能有成員函式,而c++中可以有

struct point 

};

4.c語言結構體中不能宣告靜態變數,而c++可以

struct point 

;

5.c語言結構體中的變數不能有訪問修飾符,只能是public,而c++中的可以有

struct point 

;

6.c語言中結構體不能繼承,而c++中可以

#include

using

namespace std;

struct point

;struct point2d :point

;int

main()

我們知道,對於未初始化的全域性變數,編譯器會自動將其初始化未0;而未初始化的區域性變數,它的值則是未知的。因為全域性變數在程式開始執行之後位址便不會發生改變,因此程式啟動時將其初始化未0不會浪費多少時間。而區域性變數則不同,區域性變數的儲存空間是動態分配的,每次呼叫函式時都可能是不同的,如果每次呼叫該函式都將區域性變數進行初始化,則會帶來許多的時間耗費。因此,未顯式被初始化區域性變數的值是未知的,它的值取決於該位址之前的值。

結構體和物件的初始化則是比變數的初始化更為複雜,結構體和物件中可能含有指標等必須進行初始化的成員,有的可能還涉及到動態記憶體分配等操作。因此,通過定義乙個函式來顯式的對結構體或者物件進行初始化是有必要的。我們通過自定義乙個成員函式來對結構體進行初始化是一種可行的方式,在每次定義結構體之後都利用該函式對結構體進行初始化即可。但這種方式未免顯得有些麻煩,由於缺少強制性,程式設計師可能會忘記呼叫該函式。因此,c++提供了建構函式,它在結構體或物件定義的時候被自動呼叫來進行初始化

建構函式有以下幾個特點:

1.建構函式是一類特殊的成員函式

2.建構函式的名字和結構體/類的名字相同

3.建構函式可以過載

4.如果不編寫建構函式,編譯器會自動生成乙個建構函式

下面是乙個簡單的例子:

#include

using

namespace std;

struct point

;point::

point

(int a,

int b)

intmain()

上例中為結構體point定義了建構函式,函式有兩個引數,用於給成員變數賦值。

此建構函式還可以有如下簡單寫法

struct point 

;point::

point

(int a,

int b):x

(a),

y(b)

這裡的x(a), y(b)表示x=a, y=b,還可以進一步簡化為:

struct point ;}

;

建構函式支援過載,它們的名字相同,根據引數列表不同呼叫不同的建構函式:

struct point 

;point

(int a):x

(a),

y(a);}

;

當使用point(2)建立結構體時,a=b=2

當使用point(2, 3)建立結構體時,a=2 b=3

另外,c++中還有另乙個和建構函式功能相反的函式–析構函式。它的主要作用是釋放資源,清理善後。例子如下:

#include

using

namespace std;

struct point

;point

(int a):x

(a),

y(a);~

point()

;};int

main()

2 2

goodbye world

上面結構體中的~point函式為析構函式,在主函式執行完的時候會呼叫這個函式來處理一些善後事宜。這裡自定義了析構函式,於是在程式結束之前會呼叫該析構函式,從而列印出析構函式中的"goodbye world"。注意析構函式不能過載!

實際上,c++中的結構體與類無太大區別,我們可以通過struct實現class的所有功能。而struct與類最大的區別是預設訪問許可權。

struct的預設訪問許可權為public,而class的預設訪問許可權為private。

下面通過例子說明:

#include

#include

using namespace std;

struct array

;void

setage

(int length);}

;class cat

;void

setage

(int age);}

;int

main()

上面的例子定義了array結構體和cat類,array中的成員變數和成員函式預設訪問許可權為public,而cat中的預設許可權為private。

為了提高程式的可讀性,我們應該主動設定訪問許可權而不是依靠預設許可權!

在上面這個例子中,我利用結構體來定義陣列,而利用類來定義貓。這顯然可以更好的符合我們的認知,因此我們在選擇使用結構體還是類的時候可以考慮要定義的物件是一種資料結構還是一類事物

(1) c++中的結構體比c語言中的結構體更加的靈活。

(2) c++中的結構體可定義建構函式和析構函式。

(3) c++中的結構體和類的性質與用法大多一致,但成員變數和成員函式的預設訪問許可權不同。

(3) c++中的結構體多用於表示資料結構,而類多用於表示一類事物。

c 結構體 結構體指標與python類

c 和python都屬於物件導向的語言,不同之處在於python有很多整合的第三方的包,屬於上層應用的語言,c 語言主要用來做底層的開發。之所以c 和python做對比,是因為python中用類做結構體,與c 中同出一轍。不論c 還是python 函式名 表示私有成員變數 python類 class...

類與結構體

1.c與c 中結構體的不同 1 c中的結構體不能申明函式,只能申明變數 c 中的結構體和類差不多,能申明資料成員,也能申明函式成員 2 c中的結構體不能進行封裝,而c 中由於是 類 可以進行封裝。2.c 中類與結構體的區別 首先說明c 中類與結構體在一定意義上是等價的 區別 1 在預設狀態下,結構體...

類與結構體

類與結構體 程式的資料和功能被組織為邏輯上相關的資料項和函式的封裝集合,稱之為類 類是乙個能儲存資料和執行 的資料結構。它包含資料成員,函式成員,資料成員,儲存與類或類例項相關的資料,通常是表示該類所代表現實事物的特性。函式成員,執行 表示現實事物的功能和操作。方法和字段是最重要的類成員型別。欄位是...