目录
在 C++ 中,类(Class) 是面向对象编程(OOP)的核心概念,它是一种用户自定义的数据类型,用于封装数据(属性) 和操作数据的函数(方法),实现了 “数据与操作的结合”。
如何理解类?
可以把类想象成一个 “模板” 或 “蓝图”,而根据这个模板创建的具体实例称为 “对象(Object)”。
例如:
- “汽车” 可以看作一个类,它包含属性(颜色、品牌、速度)和方法(启动、加速、刹车);
- 你家的 “特斯拉 Model 3” 就是 “汽车” 类的一个具体对象,它有具体的颜色(红色)、品牌(特斯拉),并且可以执行启动、加速等操作。
类的核心特性:封装
类通过访问控制符限制对内部数据的直接访问,只允许通过类提供的方法操作数据,这就是 “封装”。封装的好处是:
- 隐藏内部实现细节,只暴露必要的接口;
- 防止外部误操作导致数据混乱。
类的基本组成
一个类通常包含以下部分:
- 成员变量(属性):存储对象的数据(如颜色、年龄);
- 成员函数(方法):操作成员变量的函数(如设置颜色、获取年龄);
- 访问控制符:
public(公开,外部可访问)、private(私有,仅类内可访问)、protected(保护,类内和派生类可访问); - 特殊函数:构造函数(初始化对象)、析构函数(清理对象)、拷贝构造函数等。
类的实现步骤
下面通过一个具体示例(定义一个 Person 类)说明如何实现类。
步骤 1:声明类(类的结构)
类的声明通常放在头文件(.h)中,用 class 关键字定义,包含成员变量和成员函数的声明。
// Person.h
#ifndef PERSON_H // 防止头文件重复包含
#define PERSON_H
#include <string> // 用于字符串类型
class Person {
private: // 私有成员:仅类内可访问(封装数据)
std::string name; // 姓名
int age; // 年龄
public: // 公开成员:外部可访问(暴露接口)
// 构造函数(初始化对象,与类名相同,无返回值)
Person(std::string n, int a); // 带参数的构造函数
// 成员函数(操作数据的方法)
void setName(std::string n); // 设置姓名
std::string getName(); // 获取姓名
void setAge(int a); // 设置年龄
int getAge(); // 获取年龄
void introduce(); // 自我介绍
};
#endif // PERSON_H
步骤 2:实现类的成员函数
成员函数的实现通常放在源文件(.cpp)中,需要通过 类名::函数名 指明属于哪个类。
// Person.cpp
#include "Person.h" // 包含类的声明
#include <iostream> // 用于输出
// 实现构造函数:初始化成员变量
Person::Person(std::string n, int a) {
name = n;
// 年龄不能为负数,这里加简单校验(体现封装的优势:可控制数据合法性)
age = (a > 0) ? a : 0;
}
// 实现设置姓名的方法
void Person::setName(std::string n) {
name = n;
}
// 实现获取姓名的方法
std::string Person::getName() {
return name;
}
// 实现设置年龄的方法(带合法性校验)
void Person::setAge(int a) {
if (a > 0) {
age = a;
}
}
// 实现获取年龄的方法
int Person::getAge() {
return age;
}
// 实现自我介绍的方法
void Person::introduce() {
std::cout << "大家好,我叫" << name << ",今年" << age << "岁。" << std::endl;
}
步骤 3:使用类(创建对象并调用方法)
通过类创建对象(实例化),然后通过对象调用公开的成员函数。
// main.cpp
#include "Person.h"
int main() {
// 创建 Person 类的对象(调用构造函数初始化)
Person p1("张三", 20); // p1 是一个具体的人
// 调用公开方法操作对象
p1.introduce(); // 输出:大家好,我叫张三,今年20岁。
// 修改对象的属性(通过公开方法,而非直接访问私有变量)
p1.setName("张三丰");
p1.setAge(100);
p1.introduce(); // 输出:大家好,我叫张三丰,今年100岁。
// 尝试直接访问私有成员(编译报错,体现封装的保护作用)
// p1.name = "李四"; // 错误:name 是 private,外部不可直接访问
return 0;
}
关键细节说明
-
访问控制符的作用:
private:成员变量通常设为私有,防止外部直接修改,确保数据安全;public:成员函数(接口)设为公开,外部通过接口操作数据;protected:用于继承场景,允许派生类访问(后续继承章节会详细说明)。
-
构造函数:
- 用于对象初始化,与类名相同,无返回值;
- 若未显式定义,编译器会生成默认构造函数(无参数);
- 可以重载(定义多个参数不同的构造函数)。
-
析构函数:
- 当对象销毁时自动调用,用于释放资源(如动态分配的内存);
- 格式:
~类名(),无参数,无返回值; - 示例(在
Person类中添加析构函数):// Person.h 中声明 ~Person(); // Person.cpp 中实现 Person::~Person() { std::cout << name << "的对象被销毁了。" << std::endl; }
总结
- 类是封装数据和操作的模板,对象是类的具体实例;
- 实现类的步骤:声明类(成员变量 + 函数)→ 实现成员函数 → 创建对象并使用;
- 核心是通过
private隐藏数据,public暴露接口,实现封装性,保证数据安全和代码可维护性。

被折叠的 条评论
为什么被折叠?



