《c++入門經典》筆記8

《c++入門經典》筆記8

第八章 建立基本類

8.1類型是什麼

ios

8.2建立新類型

變量的類型提供了多項信息:c++

  • 變量佔據的內存
  • 變量可存儲的信息
  • 對變量可執行的操做

在c++中,可本身定義類型,以模擬要解決的問題。要聲明新問題,可建立一個類。類是新類型的定義。函數

8.3類和成員

c++類是一個模板,用於建立對象。定義類後,即可像使用其餘類型那樣使用根據它建立的對象。code

類是一系列捆綁在一塊兒的變量和函數,其中的變量能夠是任何其餘類型,也包括其餘類。對象

類中的變量稱爲成員變量,類中的函數稱爲成員函數或方法。blog

其實成員就是數據與操做,封裝以後就成爲了一個類。內存

聲明一個類,使用關鍵字class,好比:作用域

class Tricycle
{
public:
    unsigned int speed;
    unsigned int wheelSize;
    pedal();
    break();
};

建立一個對象,可指定類名和變量名,好比:get

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

相關文章
相關標籤/搜索