C++入門筆記--物件
類(Class)是一個模型,當我們建立例項的時候,也就是物件本身。可以理解成,類是一個設計藍圖,決定了一個物件將是什麼樣的(具備什麼樣的功能,屬性)而物件是類的一個例項化。
OOP過程(面向物件的過程)的第一步是先建立一個類,而每個類跟變數一樣都有一個名字,所以我們就從如何宣告一個類開始說起:
class Mynote{
};
//分號不要忘記 可以聯想到結構體的宣告 雖然很類似 但差別還是很大 結構體內部只宣告變數 而類裡面是變數和函式
這就建立了一個類,雖然什麼也幹不了,但他是一個成功的開始!!
注意:
- 類名的第一個字母採用大寫是一種習慣的標準,但不是硬性規定。如果非小寫那也沒辦法
- 在類的宣告末尾有一個分號,這一點就跟C語言裡的結構體很相似了
類由變數和函式組成,類的例項化物件將使用那些變數來儲存資訊,呼叫那些函式來完成某些操作。(在類裡面常會看到一些專門的術語:類裡的變數叫做屬性,函式稱為方法,本質都是一樣的)
例子:先宣告一輛車的一些簡單屬性,例如顏色,引擎,油量,輪子個數等等,
class Car{
public:
std::string color;
std::string engine;
float gas_tank;
unsigned int wheel;
};
//public 在後面的筆記中會有
現在為類定義一些方法,其實也就是定義一些函式,建立個人函式也是兩個步驟的過程:先建立函式的原型(宣告),再描述該函式本身實現的過程。 給類新增方法如出一轍:
-先在類的聲明裡建立一個方法的原型
-稍後再實現這個方法
class Car{
public:
std::string color;
std::string engine;
float gas_tank;
unsigned int wheel;
void fill_tank(float liter);
//方法的宣告:方法是“加油”,引數是“公升”
void running(void);
};
現在我們的Car類有了一個名為fill_tank的方法,他只有一個輸入引數,不需要任何的返回值。但是我們只有他的原型(宣告),要想使用它,我們還需要對這個函式進行正式的定義(告訴系統如何去實現它),方法的定義通常安排在類宣告的後面。
#include<iostream>
class Car{
public:
std::string color;
std::string engine;
float gas_tank;
unsigned int wheel;
void fill_tank(float liter);
//方法的生命:方法是“加油”,引數是“公升”
void running(void);
};
void Car::fill_tank(float liter){//::是作用域解析符 說明fill_tank 是屬於Car這個類的 例如std::cout的使用 說明cout是屬於std的
gas_tank += liter;
}
int main(){
return 0;
}
我們發覺作用域解析符(::),作用是告訴編譯器這個方法存在於何處,或者說是屬於哪一個類。例如前面講過namespace的用法,其實namespace是一個偷懶的方法,不提倡使用,因為命名是有作用域區分的,如果一開始就將名稱空間定為std,那麼以後所有的命名都是在std裡了。
針對以上說的這些可以進一步將這個類進行擴充套件,就不贅述了
面向物件程式設計技術(object-oriented programming)可以說是面向過程技術(producedural programming)的替代品。面向物件技術關注的是對資料進行怎樣的處理,面向過程技術關注的是對資料進行處理的過程。
C++允許在類裡宣告常量,但不允許對他進行賦值。
class Car{
public:
const float TANKSIZE = 85;//出錯
};
繞開這一限制的方法就是建立一個靜態常量,但不常用
class Car{
public:
static const float FULL_GAS = 85;
};
類似於結構的情況,可以在宣告某各類的同時建立一些該類的物件,這種做法在C++裡是允許的,但是作為一種良好的程式設計習慣,應該避免這種做法,一般不把類的宣告和定義寫在一起。
class Car{
//.....各種宣告
}car1,car2;
最後假設有以下程式碼:是把一個物件賦值給另一個同類的物件將會自動使他們同名的屬性有同樣的值。
Car car1,car2;
car1.setColor("WHITE");
//.......對car1物件進行各種操作
car2 = car1;