#CPP10. 【Level 0】类简介

【Level 0】类简介

类(class)

  在全面掌握 STL 之前,我们先简单认识 C++ 中的类,即 class

  在 C 语言中,我们使用 struct 来组织数据

// C 语言中的结构体
struct Point {
    double x, y;
};

  但想要在其中添加函数较为麻烦,需要使用函数指针的手段。

  在 C++ 中,class 扩展了这一概念,使得 数据操作数据的函数 可以封装在一起。

// C++ 中的类
class Point {
public:
    double x;
    double y;

    void display() {
        std::cout << "Point(" << x << ", " << y << ")" << std::endl;
    }
};

  注意:在 C++ 中,structclass 的区别仅在于默认的 访问权限(见后文)。struct 也可以包含成员函数。

  与 struct 类似,定义一个类也是定义了一种独特的数据类型,我们依然可以使用如下所示的方式创建一个 Point 类型的变量 p

int main() {
    Point p;
    p.x = 3, p.y = 4;
    p.display(); // 输出:Point(3, 4)
    return 0;
}

构造函数(constructor)

  当然,实际上的类远比示例中的复杂,很难在外部进行完整的初始化过程,因此我们有 构造函数 的概念

  构造函数与类同名且没有返回值,在创建对象时自动执行,如下所示:

class Point {
private:
    double x;
    double y;

public:
    // 构造函数
    Point(double x_value, double y_value) {
        x = x_value;
        y = y_value;
    }

    void display() {
        std::cout << "Point(" << x << ", " << y << ")" << std::endl;
    }
};

int main() {
    Point p(3.0, 4.0);
    p.display(); // 输出:Point(3, 4)
    return 0;
}

  此时如果直接使用 Point p; 构造对象则不再被允许。这是因为在你没有定义任何构造函数时,其实类带有一个默认的构造函数,你在声明

class Point {
public:
    double x, y;
};

  时,相当于

class Point {
public:
    double x, y;
    Point() {}
};

  而一旦你声明了自己的构造函数,无论参数列表与其是否相同,默认的构造函数都会被去除。

  顺带一提,可以看到被 public 修饰的段落,可以在类外部访问,而 private 则不能。

分离声明与实现

  如果类比较复杂,直接在声明中实现,实际上不利于我们观察类的结构,因此通常我们将复杂类的声明与实现分离开,以便于管理。

  例如,在 Point.h 中声明类的变量和函数

class Point {
private:
    double x, y;

public:
    // 构造函数
    Point(double x_value, double y_value);
    
    // 打印类的信息
    void display();
    
    // 计算到原点的距离
    double distance();
};

  在 Point.cpp 或者其它地方实现这些函数

Point::Point(double x_value, double y_value) {
    x = x_value;
    y = y_value;
}

void Point::display() {
    std::cout << "Point(" << x << ", " << y << ")" << std::endl;
}

double Point::distance() {
    return sqrt(pow(x, 2) + pow(y, 2));
}

Description

  实现一个名为 Circle 的类,用于表示圆。要求如下:

  • 私有成员变量
    • radiusdouble 类型),表示圆的半径
  • 公共成员函数
    • 1 构造函数
      • 默认构造函数:将半径初始化为 0
      • 带参数的构造函数:接受一个 double 类型的参数,用于初始化半径
    • 2 成员函数
      • void setRadius(double r):设置圆的半径为 r
      • double getRadius():获取圆的半径
      • double getArea():计算并返回圆的面积
      • double getCircumference():计算并返回圆的周长

Format

Input

  输入有若干行,每行先是一个字符串,可能是 R, A, C 或者 set,其含义依照上面要求所示,如果是 set,其后有一个值,表示设置的半径。

Output

  以空格分隔的若干个浮点数,精确到小数点后 3 位,其个数与查询的次数相同,表示每次查询的结果。

Samples

R
A
C
set 5.0
A
C
R
A
0.000 0.000 0.000 78.540 31.416 5.000 78.540
set 1000.0
A
C
R
3141592.654 6283.185 1000.000