從C到C 看面相物件 深入了解C 的成員函式

2021-07-26 05:49:43 字數 2716 閱讀 9542

我們都知道c是一門面相過程的語言,在c的世界裡是沒有面相物件這個概念的,但是c語言為我們提供的神兵利器,仍舊可以讓我們使用面相物件的思維方式

在c語言裡,我們每做乙個操作,都需要寫乙個函式,但是該函式都是過程化的,但是我們有兩種神兵利器,乙個叫指標,乙個叫結構體

為什麼這麼說呢?

面相物件的最基本的功能就是對資料的封裝,在c語言的世界裡,我們有結構體這個法寶,同樣可以將資料打包整整體,然後通過指標的方式,將結構體作為引數在函式中進行傳遞

舉個例子

struct book ;

typedef

struct book book;

//初始化一本書

void book_init(book *book, const

char *name, const

char *author, int total, int price)

void book_update_price(book *book, int newprice)

以上的例子很簡單,初始化一本書以及更新書價,在使用的時候,我們只需要像以下方式呼叫

book book;

book_init(&book, "wpf 程式設計寶典", "matthew macdonald", 934, 128);

//...

book_update_price(&book, 100); //降價

以上的這些使用的都是面相過程的思維。

所謂面向過程程式設計,就好比「讓某某去做某事」,而物件導向呢,就好比「某某去做某事」。從字面意思來看,面向過程貌似多了個「高階領導」,而物件導向顯得更自由。

struct book

//初始化一本書

void book_init(book *book, const

char *name, const

char *author, int price)

void book_update_price(book *book, int newprice)

//建立一本書

void book_create(book *book)

然後你就可以像以下一樣使用了

book book;

book_create(&book);

book.init(&book, "wpf 程式設計寶典", "matthew macdonald", 128);

//...

book.update_price(&book, 100);

使用這種方式來呼叫,看起來有了一種「書做了某某事」的物件導向的錯覺

當我們定義乙個class的時候,我們自己定義的成員函式就使用了我們上面的思想,參考如下**

class book 

void updateprice(int price)

};

我們是用起來顯得更簡單

book book;

book.init("wpf 程式設計寶典", "matthew macdonald", 128):

//...

book.updateprice(100);

看起來與我們使用c語言模仿的物件導向是不是很像?

接下來我們注意到乙個關鍵字this, 指的是呼叫函式的某個物件,誰呼叫了,this指的就是誰,上面的book呼叫init和updateprice的時候,this指的就是book這個物件。

我想你應該明白了,c++的物件導向,就是使用了我們的上述模擬物件導向的思維,然後c++自己將物件本身作為乙個隱含的引數傳遞給了我們的成員函式,當然,這些並不包括c++物件導向中更強大的繼承和多型。

到此我覺得你應該明白了c++成員函式與普通函式之間的區別以及其內部的原理。

再看下面**

class

student

void

maketest()

void

private:char name[32];}

;

我們在看如下呼叫

student *pstu;

pstu->maketest(); // ①

很多人都會想到,pstu是乙個未初始化的變數,以上①②兩種呼叫都會導致崩潰。再仔細想想看,真的是這樣嗎?

比較細心的同學會發現,在某些編譯器上執行,我們卻可以看到①呼叫後的列印資訊,而執行②以後,程式崩潰掉了,我想細心的你應該知道這是什麼原因了。

很簡單,我們在①處呼叫的maketest()函式,翻譯成c語言的形式應該是

void maketest(student *this)

maketest(pstu);

我們再做乙個小實驗

class test

else

}};int main()

你能猜出最終的列印資訊嗎?(��是不是跟我一樣呢)

深入了解C語言

文章內容如下 首先,我們先來看下面這個經典的 int main 從這段 裡你看到了什麼問題?我們都知道,這段程式裡少了乙個 include 還少了乙個return 0 的返回語句。不過,讓我們來深入的學習一下,這段 在c 下無法編譯,因為c 需要明確宣告函式 這段 在c的編譯器下會編譯通過,因為在編...

C 反射的深入了解

assembly.load 的使用說明如下 並不是命名空間。常用的是程式集名稱,也就是dll的名稱 關於反射assembly.load 程式集 createinstance 命名空間.類 而不管在哪一層寫這段 其中的 程式集 讀取的實際是web層bin資料夾下的dll,也就是說你反射的類的程式集dl...

深入了解C 異常處理

目錄 異常處理機制 暫緩問題處理,不在當前函式中處理,在他的呼叫者中處理 先上車,後補票 什麼是異常 任何東西都可以認為是異常,錯誤只是異常的一種 異常一旦被丟擲,不做處理,如果引發異常,會呼叫預設abort函式終止程式 捕獲和處理異常 throw 丟擲異常 值是任何型別都可以,只是我們處理異常的乙...