C++中的class和struct區別


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

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

    2,struct 在 C++ 中既可以定義訪問級別又可以定義成員函數;

 

 2,類的關鍵字:

    1,struct 在 C 語言中已經有了自己的含義,必須繼承兼容;

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

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

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

    3,class 和 struct 的用法是完全相同的,但只有一個本質區別,如下;

       1,在使用 struct 定義類時,所有成員的默認訪問級別為 public;

       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++ 的源文件里面來做類的具體實現;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM