《c++入門經典》筆記8
《c++入門經典》筆記8
第八章 建立基本類
8.1型別是什麼
略
8.2建立新型別
變數的型別提供了多項資訊:
- 變數佔據的記憶體
- 變數可儲存的資訊
- 對變數可執行的操作
在c++中,可自己定義型別,以模擬要解決的問題。要宣告新問題,可建立一個類。類是新型別的定義。
8.3類和成員
c++類是一個模板,用於建立物件。定義類後,便可像使用其他型別那樣使用根據它建立的物件。
類是一系列捆綁在一起的變數和函式,其中的變數可以是任何其他型別,也包括其他類。
類中的變數稱為成員變數,類中的函式稱為成員函式或方法。
其實成員就是資料與操作,封裝之後就成為了一個類。
宣告一個類,使用關鍵字class,比如:
class Tricycle
{
public:
unsigned int speed;
unsigned int wheelSize;
pedal();
break();
};
建立一個物件,可指定類名和變數名,比如:
Tricycle wichita;
8.4訪問類成員
建立物件後,可使用句點運算子(.)來訪問其成員函式和成員變數。
比如承接上面的:
Tricycle wichita;
wichita.speed = 6;
wichita.peadl();
訪問控制符public、protected、private就不說了,省得長篇大論。
8.5實現成員函式
對於宣告的每個成員函式,都必須進行定義
成員函式的定義可以在類中,也可以在類外,在類外定義以類名打頭,然後是作用域解析運算子(::)和函式名再加函式體。
比如:
void Tricycle::pedal()
{
std::cout<<"Pedaling trike\n";
}
程式清單8.1Tricycle.cpp
#include <iostream> class Tricycle { public: int getSpeed(); void setSpeed(int speed); void pedal(); void brake(); private: int speed; }; int Tricycle::getSpeed() { return speed; } void Tricycle::setSpeed(int newSpeed) { if (newSpeed >= 0) { speed = newSpeed; } } void Tricycle::pedal() { setSpeed(speed + 1); std::cout << "\nPedaling;tricycle speed " << speed << " mph\n"; } void Tricycle::brake() { setSpeed(speed - 1); std::cout << "\nBraking;tricycle speed " << speed << " mph\n"; } int main() { Tricycle wichita; wichita.setSpeed(0); wichita.pedal(); wichita.pedal(); wichita.brake(); wichita.brake(); wichita.brake(); return 0; }
8.6建立和刪除物件
建構函式與解構函式:
類有一個特殊的成員函式——建構函式,每次例項化物件時都將呼叫它。建構函式的職責是建立一個有效的物件,這通常包括初始化成員資料。建構函式與類同名,且沒有返回值。建構函式可以接受引數,也可以不接受。
Tricycle類的建構函式:
Tricycle::Tricycle(int initialSpeed)
{
setSpeed(initialSpeed);
}//使用了引數initialSpeed來設定成員變數speed的初始值
如果聲明瞭建構函式,也應宣告一個解構函式。建構函式建立並初始化物件,而解構函式執行清理工作並釋放分配給物件的記憶體。解構函式的名稱總是有顎化符號(~)和類名組成。解構函式不接收引數,也不返回值。
Tricycle類的解構函式:
Tricycle::~Tricycle()
{
std::cout<<"Destructed\n";
}
預設建構函式
假如您沒有宣告建構函式,編譯器將自動建立一個預設建構函式——沒有引數的建構函式,編譯器建立的這個預設建構函式不執行任何操作,就如同沒有引數且函式體為空一樣。
- 預設建構函式是沒有引數的建構函式,可以自己定義,也可以讓編譯器提供
- 如果定義了建構函式,編譯器就不會建立預設建構函式。這種情況下如果需要預設建構函式,需要自己定義。
同樣的,如果沒有定義解構函式,編譯器也將建立一個函式體為空,不執行任何操作的解構函式。
程式清單8.2 NewTricycle.cpp
#include <iostream>
class Tricycle
{
public:
Tricycle(int initialAge);
~Tricycle();
int getSpeed();
void setSpeed(int speed);
void pedal();
void brake();
private:
int speed;
};
Tricycle::Tricycle(int initialAge)
{
setSpeed(initialAge);
}
Tricycle::~Tricycle()
{
std::cout << "Destructed\n";
}
int Tricycle::getSpeed()
{
return speed;
}
void Tricycle::setSpeed(int newSpeed)
{
if (newSpeed >= 0)
{
speed = newSpeed;
}
}
void Tricycle::pedal()
{
setSpeed(speed + 1);
std::cout << "\nPedaling;tricycle speed " << speed << " mph\n";
}
void Tricycle::brake()
{
setSpeed(speed - 1);
std::cout << "\nBraking;tricycle speed " << speed << " mph\n";
}
int main()
{
Tricycle wichita(5);
wichita.pedal();
wichita.pedal();
wichita.brake();
wichita.brake();
wichita.brake();
return 0;
}