前言

从本节内容开始,我将分享一些关于C++面向对象的知识,这部分的内容,需要你具备前面的知识,如果你还有不会的或者说不熟悉的地方,请点击这里重新温习一下,废话不多说,直接进入正题吧!

C++ 类&对象

C++ 是在 C 语言基础上增加了面向对象编程的功能,其中 是 C++ 的核心概念。你可以把类理解成一种自定义的“蓝图”或者“模板”,用来描述一类对象的特性(数据)和能力(功能)。类里面的变量叫“成员变量”,负责保存数据,而函数叫“成员函数”,用来定义这些对象可以做的事情。有了类,就能很方便地创建多个“长得一样”的对象。

C++ 类定义

在 C++ 中,类(class) 是一种用来组织数据和行为的结构。定义一个类就像是在创建一个蓝图,告诉程序我们要描述一个什么样的东西(数据)以及它可以做些什么(操作)。理解类的定义会让你轻松上手面向对象编程。

如何定义一个类?

  1. 关键字 class
    使用 class 关键字告诉程序我们要定义一个类。

  2. 类名:
    给类起一个有意义的名字,就像给变量取名一样。

  3. 花括号 {}
    {} 包围住类的内容,内容包括:

    • 成员变量(属性):用来存储对象的特性或数据。
    • 成员函数(方法):用来描述对象的行为或操作。
  4. 访问权限(public):
    在类中,数据和函数可以有不同的访问权限,比如 publicprivateprotected。其中:

    • **public**:外部代码可以访问这些成员。
    • **private**:外部代码无法直接访问这些成员(稍后会详细说明)。

举个例子:定义一个盒子类

以下是一个简单的类定义,用来描述一个盒子:

1
2
3
4
5
6
class Box {
public:
double length; // 盒子的长度
double breadth; // 盒子的宽度
double height; // 盒子的高度
};

细节解析:

  1. 类名 Box

    • 这个类名表示我们要定义的是“盒子”。
    • 以后我们可以用这个类创建具体的“盒子对象”。
  2. public 访问权限:

    • public 下定义的变量是公开的,也就是说,外部代码可以直接访问这些变量。
    • 如果不写 public,默认情况下,类的成员是 private,外部代码将无法直接访问它们。
  3. 成员变量:

    • lengthbreadthheight 是盒子的属性,它们描述了盒子的长度、宽度和高度。
    • 它们的数据类型是 double,表示这些属性可以存储带小数的数字。

类是蓝图,对象是实物

定义类之后,你可以通过类来创建实际的对象。比如,Box 类是一个蓝图,而对象就是你用这个蓝图制作出的具体“盒子”:

1
2
3
4
Box myBox;  // 创建一个盒子对象
myBox.length = 10.5; // 给盒子对象的长度赋值
myBox.breadth = 5.5; // 给盒子对象的宽度赋值
myBox.height = 3.2; // 给盒子对象的高度赋值

通过这种方式,myBox 成为了一个具体的盒子,它有了自己的长、宽、高。

总结:类的作用

  1. 定义属性:类中包含的变量(如 lengthbreadthheight)用于存储对象的数据。
  2. 定义行为:类中还可以包含函数,描述对象可以完成哪些动作(这里暂时未涉及函数)。
  3. 灵活性:通过类,你可以方便地创建多个对象,每个对象可以有自己独特的数据。

类的核心是将数据和操作封装在一起,使得程序更加模块化和易于维护。

C++定义对象

在 C++ 中,对象(object) 是类的具体实现。类就像一张设计图,而对象就是根据设计图实际“生产”出来的东西。通过对象,我们可以操作和使用类中定义的属性和方法。

下面,我们一步步来理解如何创建对象、如何操作对象的成员,以及如何通过实例加深理解。


1. 创建对象

要创建一个对象,就像声明一个变量一样简单。假设我们有一个类 Box,可以这样声明对象:

1
2
Box Box1;  // 创建一个类型为 Box 的对象 Box1
Box Box2; // 创建一个类型为 Box 的对象 Box2

每个对象都有自己的独立数据。换句话说,Box1Box2 是两个不同的盒子,它们可以有不同的长度、宽度和高度。


2. 访问对象的成员

直接访问公共成员

类的公共成员(public)可以通过 点操作符(. 来访问和操作。例如:

1
2
3
Box1.length = 6.0;  // 设置 Box1 的长度为 6.0
Box1.breadth = 7.0; // 设置 Box1 的宽度为 7.0
Box1.height = 5.0; // 设置 Box1 的高度为 5.0

通过成员函数访问成员

有时候,我们会用成员函数来设置和获取对象的属性。例如:

1
2
Box1.set(6.0, 7.0, 5.0);  // 调用 set 函数一次性设置 Box1 的长宽高
double volume = Box1.get(); // 调用 get 函数获取 Box1 的体积

这种方式不仅简洁,还能让我们在函数中添加额外的逻辑,比如检查输入值是否合法。


3. 实例代码解析

下面是一个完整的例子,我们结合类和对象来计算多个盒子的体积。

代码:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;

class Box {
public:
double length; // 长度
double breadth; // 宽度
double height; // 高度

// 成员函数声明
double get(); // 计算体积
void set(double len, double bre, double hei); // 设置盒子的长宽高
};

// 成员函数定义
double Box::get() {
return length * breadth * height; // 返回体积
}

void Box::set(double len, double bre, double hei) {
length = len;
breadth = bre;
height = hei;
}

int main() {
Box Box1, Box2, Box3; // 创建 3 个 Box 对象
double volume = 0.0;

// 直接设置 Box1 的属性
Box1.length = 6.0;
Box1.breadth = 7.0;
Box1.height = 5.0;

// 直接设置 Box2 的属性
Box2.length = 12.0;
Box2.breadth = 13.0;
Box2.height = 10.0;

// 计算并输出 Box1 和 Box2 的体积
volume = Box1.length * Box1.breadth * Box1.height;
cout << "Box1 的体积:" << volume << endl;

volume = Box2.length * Box2.breadth * Box2.height;
cout << "Box2 的体积:" << volume << endl;

// 使用 set 和 get 方法设置 Box3 的属性并获取体积
Box3.set(16.0, 8.0, 12.0);
volume = Box3.get();
cout << "Box3 的体积:" << volume << endl;

return 0;
}

输出结果:

1
2
3
Box1 的体积:210
Box2 的体积:1560
Box3 的体积:1536

4. 细节说明

成员函数的作用

  • set() 函数:用来一次性设置盒子的长度、宽度和高度。
  • get() 函数:用来计算盒子的体积。

这两个函数的好处是可以让代码更规范、更清晰,同时也能避免直接操作数据成员可能带来的错误。

为什么要用点操作符(.)?

点操作符 . 的作用是连接对象和它的成员(属性或函数)。例如:

  • Box1.length 表示访问 Box1 的长度属性。
  • Box3.get() 表示调用 Box3get() 函数。

关于访问权限:

  • 公共成员(public
    • 例如 lengthbreadthheight,可以直接通过对象访问。
  • 私有成员(private
    • 私有成员不能直接访问,通常需要通过函数(如 set()get())来间接操作。

5. 总结

  1. 对象是类的具体实例
    • 类是设计图,对象是根据设计图创建的实际东西。
  2. 访问对象的成员
    • 通过点操作符直接访问公共成员。
    • 通过成员函数间接访问私有或公共成员。
  3. 使用成员函数的优势
    • 更加安全、规范,能够控制数据的合法性。
  4. 分离定义和实现
    • 在类中声明函数,在类外实现函数,有助于让代码结构更清晰。

类&对象详解

C++ 类与对象深入理解

C++ 的类和对象不仅包括我们之前学到的基础知识,还有许多高级概念。这些概念可以帮助我们更高效、更灵活地编写代码。下面是一些重要的类和对象相关概念的通俗解释和用途。

C++ 类与对象相关概念总结

概念 描述(通俗易懂的解释)
类成员函数 类中的函数称为成员函数,它是用来操作类中数据的函数。它们就像工具,帮助你操作和处理类的属性,比如设置值或计算结果。
类访问修饰符 类的属性和函数可以设置为:
- public:可以被外部直接访问。
- private:只能在类内部使用,外部不能直接访问。
- protected:继承时的特殊访问方式。
构造函数 & 析构函数 构造函数是在创建对象时自动调用的特殊函数,用于初始化对象的属性。
析构函数则是在对象被销毁时调用,用于清理资源。它们是一对让对象创建和销毁更方便的函数。
拷贝构造函数 拷贝构造函数用于用一个已有的对象来创建新的对象,就像“克隆”一样。比如将对象 A 的值赋给对象 B 时会调用拷贝构造函数。
友元函数 友元函数是类的“朋友”,它可以访问类的私有和受保护成员。虽然它不是类的成员,但它能帮助实现更复杂的操作。
内联函数 内联函数是编译器直接把函数代码插入到调用点,省去了函数调用的开销,适合用在短小的函数上。
this 指针 每个对象都有一个特殊指针 this,它指向对象本身。通过 this 指针可以访问或操作当前对象的属性。
指向类的指针 类的指针就像指向结构体的指针一样。它允许你通过指针访问对象的属性和方法,适合处理动态创建的对象或需要共享对象的情况。
静态成员 静态成员属于整个类而不是某个对象。静态变量可以被所有对象共享,静态函数可以在没有对象的情况下调用。比如计数器、全局配置等。

深入理解概念:举例说明

1. 类成员函数

类的成员函数用于操作类的属性,例如设置值和获取值:

1
2
3
4
5
6
7
8
9
10
11
12
class Box {
public:
double length; // 公共成员变量

void setLength(double len) { // 成员函数
length = len; // 设置长度
}

double getLength() { // 成员函数
return length; // 获取长度
}
};
2. 类访问修饰符

控制类成员的访问权限:

1
2
3
4
5
6
7
8
9
10
11
class Box {
private:
double length; // 私有变量,外部无法直接访问
public:
void setLength(double len) { // 公共函数,用于设置 length
length = len;
}
double getLength() { // 公共函数,用于获取 length
return length;
}
};
3. 构造函数 & 析构函数

构造函数和析构函数会自动执行,无需手动调用:

1
2
3
4
5
6
7
8
9
class Box {
public:
Box() { // 构造函数
cout << "对象被创建!" << endl;
}
~Box() { // 析构函数
cout << "对象被销毁!" << endl;
}
};
4. 拷贝构造函数

通过已有对象创建新对象:

1
2
3
4
5
6
7
8
class Box {
public:
double length;
Box(double len) : length(len) {} // 普通构造函数
Box(const Box& obj) { // 拷贝构造函数
length = obj.length;
}
};
5. 静态成员

静态成员变量和函数属于整个类:

1
2
3
4
5
6
7
class Box {
public:
static int count; // 静态变量
Box() { count++; }
};

int Box::count = 0; // 初始化静态变量