如果說任何事物都可以抽象為一種數據結構,這個數據結構肯定要有我們想操作的對象--該事物本身(它包括各種屬性、要素),定義為數據;而這個事物本身(數據)肯定能進行各種各樣的操作,如整數能+-*/%等,開關有開、關等操作,這各種各樣的操作即為運算;既然是運算可定有運算規則,如浮點數就不能進行取余運算,開關不能吃等;總結起來:
個人認為,C語言可以說是以數值型數據結構(如void,char,int,float)
為基礎,抽象出來的語言;它的任何操作都都被局限於數值型數據結構這一層面上了,即使有構造類型struct可以定義些復雜類型,但是它還是需要人工進行顯式地賦值(詳細見下面說明),可以說構造類型struct可以上C語言擁有面向對象的思想,但是實現不了真正的面向對象,同時也可以理解為什麼被稱為面向過程的了。因此可以看出C語言中各種操作都是圍繞變量和函數,變量是如下類型的數值型數據結構,而函數是針對這些變量的數值型運算!
利用struct構造類型已經初步具有面向對象的思想了(如Linux內核完全使用C語言編寫,但是使用了很多面向對象的思想),但是它仍然局限於數值型數據結構這一層面上,因為構造類型struct中成員函數不能直接定義,仍需利用指針,然後對於指針進行函數地址的賦值(數值的賦值),並且C定義的struct構造類型不能實現封裝、隱藏,所有數據都是人工顯式執行的,見下面實例分析。
例如,定義一個new_type的數據結構,包含了a,b兩個操作數(數據),還有一個對於這兩操作數的運算add。
[cpp]
- struct new_type{
- int a;
- int b;
- int (*add)(int a, int b);
- };
-
- int f_add(int a, intb)
- {
- return a+b;
- }
-
- struct new_type test;
- test.add=f_add; //1。可以看出是基於數值型數據結構層面的賦值
- test->add(test.a, test.b); //2。所有數據都是顯式地調用執行的
見上,即使有struct構造類型可以定義些復雜類型,但是它還是需要人工進行顯式地賦值(如1);而且它還要在其他函數中顯式地調用,不能實現封裝、隱藏(如2)。
class與struct之間的區別