認識類,先認識對象。數組
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 }
當一個數據域是一個對象,而這個對象又沒有無實參構造函數,那麼就必須使用初始化列表了。
由於在類中聲明一個對象(做爲數據域),會自動的調用這個對象的類的構造函數,以建立該數據域對象。同時,和變量同樣,在類中建立對象是不能直接初始化的(即利用帶參數的構造函數),因此只能調用無實參的構造函數,若是此時沒有無實參構造函數,就會出錯。