我們都知道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 丟擲異常 值是任何型別都可以,只是我們處理異常的乙...