Type: Default 1000ms 256MiB

【Level 0】类简介

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

类(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 

C++入门

Not Attended
Status
Done
Rule
IOI
Problem
16
Start at
2024-9-3 0:00
End at
2024-11-25 8:00
Duration
2000 hour(s)
Host
Partic.
112