C++中的class和struct區別

1,通過不停的改進,結構體 struct 變得原來越不像它在 C 語言中的樣子了;函數

    1,struct 在 C 語言中僅爲了定義一個變量的集合,僅此而已,不能定義函數;spa

    2,struct 在 C++ 中既能夠定義訪問級別又能夠定義成員函數;設計

 

 2,類的關鍵字:code

    1,struct 在 C 語言中已經有了本身的含義,必須繼承兼容;對象

       1,而在 C++ 中有了別的含義,違背了設計 C++ 兼容 C 的初衷;blog

       2,尋找新的關鍵字來定義類;繼承

    2,在 C++ 中提供了新的關鍵字 class 用於類定義;接口

    3,class 和 struct 的用法是徹底相同的,但只有一個本質區別,以下;開發

       1,在使用 struct 定義類時,全部成員的默認訪問級別爲 public;get

       2,在用 class 定義類時,全部成員的默認訪問級別爲 private;

  

 3,class 的初探:

 1 #include <stdio.h>
 2 
 3 struct A  4 {  5     // defualt to public
 6     int i;  7     // defualt to public
 8     int getI()  9  { 10         return i; 11  } 12 }; 13 
14 class B  // 之後開發中,只使用這個關鍵自定義類;
15 { 16     // defualt to private
17     int i; 18     // defualt to private
19     int getI() 20  { 21         return i; 22  } 23 }; 24 
25 int main() 26 { 27  A a; 28  B b; 29     
30     a.i = 4; 31     
32     printf("a.getI() = %d\n", a.getI()); 33     
34     b.i = 4; 35     
36     printf("b.getI() = %d\n", b.getI()); 37     
38     return 0; 39 }

   

 4,小實例:

    1,需求:開發一個用於四則運算的類:

       1,提供 setOperator 函數設置運算類型;

       2,提供 setParameter 函數設置運算參數;

       3,提供 result 函數進行運算:

           1,其返回值表示運算的合法性;

           2,經過引用參數返回結果;

    2,客戶關心使用、不關心實現、簡單易用就好,類的開發者關心類如何實現、內部實現方式;

    3,既然類分爲外部接口(使用方式)和內部實現(實現細節)兩部分,則最終的源代碼上也應該有所體現;

          

 5,類的真正形態:

    1,C++ 中的類支持聲明(類的使用方式)和實現(類實現的內部細節)的分離;

    2,使用頭文件和源文件的方式來將類的實現和定義分開:

       1,*.h 頭文件中只有類的聲明:

           1,成員變量和成員函數的聲明,不包括成員函數體的實現;

       2,*.cpp 源文件中完成類的其它實現:

           1,成員函數的具體實現;

          

 6,Operator 類的分析:

    1,*.h 文件:

 1 #ifndef _OPERATOR_H_  2 #define _OPERATOR_H_
 3 
 4 class Operator  5 {  6 private:  7     char mOp;  8     double mP1;  9     double mP2; 10     
11 public: 12     bool setOperator(char op); 13     void setParameter(double p1, double p2); 14     bool result(double& r); 15 }; 16 
17 #endif

     1,僅僅是類的聲明而已,表達的也就是用戶的需求,僅僅是如何使用這個類;

   2,*.cpp 文件:

 1 #include "Operator.h"
 2 
 3 bool Operator::setOperator(char op)  4 {  5     bool ret = false;  6         
 7     if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )  8  {  9         ret = true; 10         mOp = op; 11  } 12     else
13  { 14         mOp = '\0'; 15  } 16         
17     return ret; 18 } 19 
20 void Operator::setParameter(double p1, double p2) 21 { 22     mP1 = p1; 23     mP2 = p2; 24 } 25     
26 bool Operator::result(double& r) 27 { 28     bool ret = true; 29         
30     switch( mOp ) 31  { 32         case '/': 33             if( (-0.000000001 < mP2) && (mP2 < 0.000000001) ) 34  { 35                 ret = false; 36  } 37             else
38  { 39                 r = mP1 / mP2; 40  } 41             break; 42         case '+': 43             r = mP1 + mP2; 44             break; 45         case '*': 46             r = mP1 * mP2; 47             break; 48         case '-': 49             r = mP1 - mP2; 50             break; 51         default: 52             ret = false; 53             break; 54  } 55         
56     return ret; 57

     1,考慮的是這個類的這些函數功能該如何實現;

   3,類的使用:

 1 #include <stdio.h>
 2 #include "Operator.h"
 3 
 4 int main()  5 {  6  Operator op;  7     double r = 0;  8     
 9     op.setOperator('/'); 10     op.setParameter(9, 3); 11     
12     if( op.result(r) ) 13  { 14         printf("r = %lf\n", r); 15  } 16     else
17  { 18         printf("Calculate error!\n"); 19  } 20     
21     return 0; 22 }

       1,編寫 main() 函數的函數體時,實際上是在使用一個類,可是沒有關心它是怎麼實現的,僅僅是調用公開的成員函數這些公開的成員函數就是這個 Operator 類的使用方式;

       2,使用類的方式:定義這個類的對象並經過對象來調用共有成員變量或者成員函數;

   

 7,小結:

    1,C++ 引進了新的關鍵字 class 用於定義類;

       1,今後後只使用 class 定義類(通常的);

       2,struct 只用來表示變量的集合(通常的),表明一個結構體;

    2,struct 和 class 的區別在於默認訪問級別的不一樣;

    3,C++ 中的類支持聲明和實現的分離,意義在於分兩個角度來看待類,一個是聲明的角度、一個是實現的角度:

       1,在頭文件中聲明類;

           1,類的使用方式;

       2,在源文件中實現類;

           1,類的實現細節;

       3,在具體開發中,在 C++ 的頭文件裏面來作類的聲明,在 C++ 的源文件裏面來作類的具體實現;

相關文章
相關標籤/搜索