初識C++類

  認識類,先認識對象。數組

  1. 對象:一個對象標識現實世界中獨一無二的實體。例如,一名學生,一張桌子,一個圓……一個對象具備惟一的身份、狀態和行爲。對象的狀態用數據域(data fileds)來表示,也成爲對象的屬性,在程序實現中用變量、數組來體現。對象的行爲用一組函數來表示,對對象調用一個函數就是請求對象執行一個任務。函數

  2. 類(class):類是相同類型的對象的一個通用模版。在C++類中,用變量定義數據域,用函數定義行爲。同時一個類還提供了一些特殊的函數——構造函數(constructor),在建立新的對象時候,這些函數會被調用。ui

 1 class Circle
 2 {
 3 public:
 4     // The radius of this circle -----data filed
 5     double radius;
 6 
 7     // Constructor function on argument
 8     Circle()  //--- default. Name is same to the class name
 9    {
10         radius = 1.0;  
11     }
12    
13    // Constructor function on argument
14    Circle(double newradius)  // no return type, include void
15     {
16        radius = newraduis;  
17     }
18 
19     // function
20    double getArea()
21     {
22         return radius*radius*3.1415926;
23     }         
24 };

  3. 構造函數this

    一個類的構造函數的名字與類名是相同的。構造函數能夠被重載,只要它們的簽名(原型)不同。spa

    一個類一般都會有一個無實參的構造函數,例如Circle(),若是一個類中沒有構造函數被聲明,C++會隱含的聲明這樣一個無實參的空構造函數。指針

    構造函數沒有返回類型,即函數名前面沒有類型關鍵字。code

    其做用是建立對象並初始化。對象

   關於默認構造函數:blog

          默認構造函數讓「聲明對象但不初始化」成爲了可能。即:ci

               Circle  C1;  // 這裏正是調用了默認構造函數    等價於  int x;

         當且僅當沒有定義任何構造函數時,編譯器纔會提供默認構造函數。即:若是定義了一個非默認的構造函數,則默認的構造函數就不存在。此時「聲明對象且不初始化」將出錯。

          定義默認構造函數有兩種方式:

              (1) 給已有的構造函數的參數提供全部的默認值。

                  Circle(double radius=10);

              (2) 經過函數重載來定義另外一個構造函數。   

            Circle()  //--- default. Name is same to the class name

{
 radius = 1.0;  }

 

  4. 對象

  建立對象的語法:

ClassName  variableName;
ClassName  variableName(arguments);  // 帶參數的構造函數建立對象

例如:Circle circle1;
Circle circle2(10.2);

 

  訪問對象:當一個對象建立之後,能夠用對象成員訪問運算符(. ,點運算符)來訪問對象的數據和調用對象的函數。

objectName.dataFiled
objectName.function(argument)

  5. 關鍵字public

     代表全部的數據域、構造函數和普通成員函數都是能夠經過類對象來訪問的。

 

  6. 匿名對象(anonymous object):當須要建立一個對象,而且只使用一次的時候能夠建立爲匿名對象。

  

// 無參數構造函數建立匿名對象
ClassName()
// 帶參數構造函數建立匿名對象
ClassName(arguments)

// 建立了一個對象,並將其內容複製給circle1
circle1 = Circle();

circle2 = Circle(5.0);

  

  注意:

    1) 與普通變量相似,可使用賦值運算符(=)來進行對象間的複製

    circle1 = circle2;  // 將對象circle2的內容複製給circle1,circle1和circle2仍然是兩個不一樣的對象;

    2)和數組名同樣。一旦一個對象被聲明以後,它是獨一無二的,是一個特定的對象,不能對它從新賦值,讓他表示另一個對象。

 

 

 

類的聲明和實現分離

   C++容許將類的聲明和實現分離。類聲明描述了類的約定(數據域的定義和函數的原型),而類實現則實現了這一約定。聲明放在.h文件中,實現放在.cpp文件中,實現和分離應該使用相同的名字。在實現中應該用#indclude 「**.h」包含聲明文件。

   在實現文件(.cpp)中,全部的函數名以前必須有ClassName::,以代表該函數是定義域這個類中的。::稱爲二元做用於解析運算符

  Circle.h

 1 class Circle
 2 {
 3 public:
 4     // The radius of this circle -----data filed
 5     double radius;
 6 
 7     // Constructor function on argument
 8     Circle()  //--- default. Name is same to the class name
 
13    // Constructor function on argument
14    Circle(double newradius)  // no return type, include void
18 
19     // function
20    double getArea()      
24 };

Circle.cpp

#include "Circle.h"

 7     // Constructor function on argument
 8     Circle::Circle()  //--- default. Name is same to the class name
 9    {
10         radius = 1.0;  
11     }
12    
13    // Constructor function on argument
14    Circle::Circle(double newradius)  // no return type, include void
15     {
16        radius = newraduis;  
17       }
18 
19     // function
20    double Circle::getArea()
21     {
22         return radius*radius*3.1415926;
23      }         
24 };

注意:若是一個函數在類聲明(.h)內實現的,那麼它就自動成爲一個內聯(inline)函數。

 

  對象指針

  能夠定義一個對象指針變量,而後將一個對象的地址賦值給該指針變量,而後用該指針變量來使用訪問對象。

  

Circle circle1;
Circle *pCircle = &circle1;

  利用指針訪問對象成員(間接訪問):

  1)解除指針引用,而後用點運算符訪問:  (*pCircle).radius    (*pCircle).getArea()

  2) 箭頭運算符(->):直接經過指針變量訪問。  pCircle->radius    pCircle->getArea()

 

  動態建立對象

  ClassName *pObject;

  pObject = new ClassName(arguments);

  delete pObject;

 

  數據域封裝

  爲防止客戶端程序直接修改類的屬性(數據域),應該使用private關鍵字,將數據域聲明爲私有的,這就是數據域封裝。若是一個數據域是私有的,那麼在類以外的程序中,將沒法經過直接引用類對象來訪問它。 爲使私有數據域能夠被訪問,能夠定義一個成員函數get返回數據域的值,定義一個set函數爲數據域設置新的值。

 

 1  class Circle
 2  {
 3  
 4      // Constructor function on argument
 5      Circle()  //--- default. Name is same to the class name
 6     {
 7          radius = 1.0;  
 8     }
 9    
10     // Constructor function on argument
11     Circle(double newradius)  // no return type, include void
12      {
13         radius = newraduis;  
14        }
15  
16      // function
17     double getArea()
18      {
19         return radius*radius*3.1415926;
20      }        
21        
22        // Return the radius of this circle
23        double getRadius()
24       {
25             return radius;
26       }
27 
28       // Set a new radius
29       double setRadius(double newRadius)
30      {
31         radius = (newRadius >= 0) ? newRadius : 0;
32        }
33 
34 
35 private:
36      // The radius of this circle -----data filed
37      double radius;
38  
39  };

 

   變量的做用域: 數據域定義爲變量的形式,能夠被類中的全部構造函數和成員函數訪問,並且數據域和函數的聲明順序能夠是任意的

  在類中,函數內聲明的變量爲局部變量,其做用域是在函數代碼塊內。可是局部變量的優先級比數據域高,若是兩者的名字相同,則在函數中,數據域的值江北覆蓋。所以,在類聲明中,數據域和局部變量的名字不能相同。

 

  this指針

  前面說過的變量的做用域裏,在類中局部變量的優先級比數據域高。有時候在類裏面的構造函數或者成員函數中,要用數據域作參數,要訪問數據域,這時這個參數就會覆蓋掉數據域,爲了不這種覆蓋,能夠用this指針。this指針是C++內置的一個特殊指針,用於引用(當前函數)的調用對象

13    // Constructor function on argument
14    Circle::Circle(double radius)  // radius is a local variable
15     {
16        this->radius = raduis;  // this point to current object
17       }
18 

 

  構造函數初始化列表

  語法:

    

ClassName(paramentList)

:datafiled1(value1), datafiled2(value2) //初始化列表,前面有個冒號,最後沒有逗號

例如:

  

1       // Constructor function on argument
2       Circle()  //--- default. Name is same to the class name
3       : radius(1.0)  // 初始化列表
4      {
5      }

當一個數據域是一個對象,而這個對象又沒有無實參構造函數,那麼就必須使用初始化列表了。

由於在類中聲明一個對象(做爲數據域),會自動的調用這個對象的類的構造函數,以建立該數據域對象。同時,和變量同樣,在類中建立對象是不能直接初始化的(即利用帶參數的構造函數),因此只能調用無實參的構造函數,若是此時沒有無實參構造函數,就會出錯。

相關文章
相關標籤/搜索