C 類 有了物件之後

2021-09-25 19:31:26 字數 2031 閱讀 4192

問:c++的書為什麼比c厚那麼多?

答:有了物件後就是麻煩。

雖然這只是調侃,但不得不承認,c++在語法特性上要比c複雜,因此本文也只是挑選類的部分內容來闡述。

另外一提,物件導向本身是一種程式設計思想,只是c++在語言特性層面就支援物件導向,而c並不支援。

struct human

};

從上面可以看到,除了多了getage成員函式,其他部分和c語言中的結構體是沒有太大的差別的。但是需要注意的是,編譯器在處理類的時候,先編譯成員的宣告,然後才會輪到成員函式。也就是說,即便getage函式在age的宣告之前,也是可以編譯過的。

struct human

unsigned int age;

string name;

double height;

};

上面的**中,雖然age的宣告再getage函式之後,但是不影響編譯。

以下幾種方式都可以用來宣告類:

human human;

struct human human1;//這種形式和c語言中非常像

不過下面這種方式是不行的奧:

human human();
因為這會被認為是函式的宣告,因此編譯會報錯。從後面可以看到,

類本身就是乙個作用域,所以我們可以看到,在getage函式中,可以直接訪問age成員。而成員函式也可以定義在類的外部,但是為了說明這個成員函式是類的成員,就必須使用作用域符,例如在類的外部定義getage:

unsigned int human::getage()

當然前提是在類中已有宣告:

unsigned int getage();
通常來說,成員函式實現可能比較複雜,因此常常會在類中宣告成員函式,但是在類的外部定義,以便閱讀和組織**。

無論在c語言中還是在c++中,對於臨時變數(或者說非靜態,全域性變數)宣告之後最好進行初始化。對於普通資料型別,如int,double等都可以直接初始化為0,那麼類中的資料是複雜的,我們必須有乙個或幾個函式用來實現類物件的初始化,類中這樣的乙個或幾個函式就是建構函式。對於建構函式需要關注以下幾點:

看下面的**:

//**:

#include using namespace std;

struct human

};int main()

unsigned int getage()

};int main()

unsigned int getage()

};這個時候,就需要通過呼叫getage函式來訪問資料成員,而不是直接訪問了:

human.getage();
封裝有什麼好處呢?顯然:

雖然類中有很多成員,包括資料成員和成員函式,但是對於乙個類占用的空間來說,與c中的struct是類似的,即使用sizeof計算其大小時,只需要計算其非靜態資料成員大小(嚴格來說,是非靜態資料成員,虛函式,虛基類),所以對於64位程式來說,sizeof(human)的大小為24位元組(需要考慮位元組對齊,可參考《理一理位元組對齊的那些事》)。到這裡其實也可以猜想,不同的human物件資料成員不同,但是其普通成員函式都是只有乙份

但是需要特別注意的是,c++類允許沒有資料成員,那麼乙個沒有資料成員的類(沒有非靜態資料成員變數,沒有虛函式,也沒有虛基類),大小是多少呢?

#include using namespace std;

class empty

};int main()

我們從前面的內容可以看到,與c語言相比,c++的類至少多了以下特點:

介紹到這裡你以為就完了嗎?還早的很。

如有不妥之處,還請多多指教。

關於c++ 空類大小,你有什麼補充的嗎?

有了Class物件,能做什麼?

建立類的物件,呼叫class物件的newinstance 方法 首先通過反射獲取class物件 class c1 class.forname com.kuang.reflect.user 第一種方法 建立乙個物件 user user user c1.newinstance 本質是呼叫了user實體類...

C 物件析構之後再訪問

在物件被析構之後,仍然可以通過該物件的指標訪問相應的靜態方法以及沒有被static關鍵字修飾,但是沒有訪問非靜態成員變數的方法 如果訪問了靜態成員變數,則會根據不同的編譯器得到不同的結果,可能是預期之外的值,可能是直接段錯誤。如果方法a呼叫了方法b,並且方法a和b都是沒有被static關鍵字修飾,且...

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...