跳转至

Csp s cpp

2.1 类(class)

2.1.1 类的概念及简单应用

​ C++是一种面向对象的编程语言,它通过类(Class)的概念来实现面向对象编程(OOP)。类是一种用于定义对象的模板,它将数据(成员变量)和操作(成员函数)封装在一起。通过创建类的实例(对象),我们可以使用类的功能。

1、类的定义:

类的定义使用关键字class,后面跟类名。类的主体包含在一对大括号中,类定义以一个分号结束。类的成员变量和成员函数称为类的成员

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class ClassName {
  public:
    // 成员变量
    int variable;

    // 成员函数(方法)
    void function() {
      // 函数实现
    }
};

2、访问修饰符:

访问修饰符用于确定类成员的可访问性。常用的访问修饰符有:

  • public:所有代码都可以访问的成员。
  • private:仅类的成员函数可以访问的成员。
  • protected:类的成员函数和派生类可以访问的成员。

3、类的实例化(对象创建):

创建类的对象时,需要使用类名作为类型,然后给对象起一个名称。对象创建后,可以使用点操作符.来访问其成员变量和成员函数。

Text Only
1
2
3
ClassName objectName;
objectName.variable = 10;
objectName.function();

4、简单的类应用示例:

​ 下面是一个简单的C++类应用示例,定义了一个Circle类,包含半径(radius)成员变量,计算面积(area)和周长(circumference)的成员函数。

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cmath>

// 定义 Circle 类
class Circle {
  public:
    double radius;

    double area() {
      return M_PI * radius * radius;
    }

    double circumference() {
      return 2 * M_PI * radius;
    }
};

int main() {
  // 创建 Circle 对象
  Circle circle;
  circle.radius = 5;

  // 计算面积和周长
  double area = circle.area();
  double circumference = circle.circumference();

  std::cout << "半径为 " << circle.radius << " 的圆的面积为: " << area << std::endl;
  std::cout << "半径为 " << circle.radius << " 的圆的周长为: " << circumference << std::endl;

  return 0;
}

​ 以上示例中,我们定义了一个Circle类,包含半径成员变量和计算面积、周长的成员函数。在main函数中,我们创建了一个Circle对象,设置半径,然后计算并输出面积和周长。

2.1.2 成员函数和运算符重载

​ 成员函数和运算符重载是C++面向对象编程的重要特性。成员函数是定义在类内部的函数,用于操作类的成员变量。运算符重载是一种允许重新定义或扩展现有运算符的行为的特性,使得这些运算符可以用于自定义的数据类型(如类)。

1、成员函数:

​ 成员函数可以定义在类内部或类外部。定义在类内部的成员函数会自动成为内联函数。在类外部定义成员函数时,需要使用类名和作用域解析运算符::

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class ClassName {
  public:
    void function1() {
      // 类内部定义的成员函数
    }

    void function2(); // 类外部定义的成员函数声明
};

// 类外部定义的成员函数
void ClassName::function2() {
  // 函数实现
}

2、运算符重载:

​ 运算符重载允许对现有运算符的行为进行重新定义,使其适用于自定义类型。运算符重载使用关键字operator和运算符符号进行声明和定义。下面是一些常见的运算符重载示例:

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Complex {
  public:
    double real;
    double imag;

    // 构造函数
    Complex(double r, double i) : real(r), imag(i) {}

    // 加法运算符重载
    Complex operator+(const Complex& other) {
      double newReal = this->real + other.real;
      double newImag = this->imag + other.imag;
      return Complex(newReal, newImag);
    }

    // 减法运算符重载
    Complex operator-(const Complex& other) {
      double newReal = this->real - other.real;
      double newImag = this->imag - other.imag;
      return Complex(newReal, newImag);
    }
};

​ 在上述示例中,我们定义了一个表示复数的Complex类,并重载了加法和减法运算符。这样我们就可以直接使用+-运算符来进行复数的加法和减法操作。

C++
1
2
3
4
5
6
7
8
9
int main() {
  Complex c1(3, 4);
  Complex c2(1, 2);

  Complex sum = c1 + c2; // 使用重载的加法运算符
  Complex diff = c1 - c2; // 使用重载的减法运算符

  return 0;
}

​ 运算符重载应谨慎使用,以保持代码的可读性和可维护性。不要滥用运算符重载来实现与原始运算符含义无关的功能。