1. 程式人生 > 實用技巧 >《c++入門經典》筆記8

《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;
}