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

posted @ 2020-07-14 20:25  小立哥  阅读(117)  评论(0编辑  收藏  举报