在C++的面向对象编程体系中,类(class)是封装数据和操作数据的函数的核心载体,通过类可以模拟现实中的实体,实现代码的模块化和复用。下面我们详细介绍C++中类的创建、使用以及相关核心特性。
类的基本定义语法
C++中使用class关键字定义类,基本结构包含类名、访问权限说明、成员变量和成员函数几个部分。访问权限分为public(公有)、private(私有)、protected(保护)三种,默认情况下类的成员是私有的。
下面是一个简单的学生类的定义示例:
// 定义学生类
class Student {
private:
// 私有成员变量,外部无法直接访问
int student_id;
char student_name[20];
public:
// 公有成员函数,用于设置学生信息
void set_info(int id, const char* name);
// 公有成员函数,用于打印学生信息
void print_info();
};
类成员函数的实现
类的成员函数可以在类内部直接实现,也可以在类外部实现。如果在类外部实现,需要使用类名::函数名的作用域解析符来指定函数所属的类。
以上面定义的Student类为例,成员函数的外部实现代码如下:
#include <cstring>
#include <iostream>
using namespace std;
// 实现设置学生信息的函数
void Student::set_info(int id, const char* name) {
student_id = id;
// 拷贝姓名到成员变量
strncpy(student_name, name, sizeof(student_name) - 1);
student_name[sizeof(student_name) - 1] = ' ';
}
// 实现打印学生信息的函数
void Student::print_info() {
cout << "学生ID:" << student_id << endl;
cout << "学生姓名:" << student_name << endl;
}
对象的创建与使用
类定义完成后,就像定义了一个新的数据类型,我们可以通过这个类来创建对象(类的实例),然后通过对象调用公有的成员函数。
对象的使用示例如下:
int main() {
// 创建Student类的对象stu1
Student stu1;
// 调用对象的成员函数设置信息
stu1.set_info(1001, "张三");
// 调用对象的成员函数打印信息
stu1.print_info();
// 创建Student类的指针对象
Student* stu2 = new Student();
stu2->set_info(1002, "李四");
stu2->print_info();
// 释放堆上的对象
delete stu2;
return 0;
}
构造函数与析构函数
构造函数是在对象创建时自动调用的特殊成员函数,用于初始化对象,函数名和类名相同,没有返回值。析构函数是在对象销毁时自动调用的特殊成员函数,用于释放资源,函数名是~类名,也没有返回值。
给Student类添加构造函数和析构函数的示例如下:
class Student {
private:
int student_id;
char* student_name; // 改为指针,演示析构函数释放资源
public:
// 构造函数,带参数初始化
Student(int id, const char* name) {
student_id = id;
// 分配内存存储姓名
student_name = new char[strlen(name) + 1];
strcpy(student_name, name);
cout << "构造函数被调用,学生ID:" << student_id << endl;
}
// 析构函数
~Student() {
cout << "析构函数被调用,学生ID:" << student_id << endl;
// 释放分配的内存
delete[] student_name;
}
void print_info() {
cout << "学生ID:" << student_id << ",姓名:" << student_name << endl;
}
};
int main() {
// 创建对象时自动调用构造函数
Student stu(1003, "王五");
stu.print_info();
// 对象离开作用域时自动调用析构函数
return 0;
}
类的访问权限说明
C++类的三种访问权限作用如下:
- public:公有成员,类的外部可以直接通过对象访问。
- private:私有成员,只有类内部的成员函数可以访问,外部无法直接访问,用于封装内部数据。
- protected:保护成员,和私有成员类似,但是可以被派生类(子类)访问,用于继承场景。
合理的访问权限设置可以保证类的封装性,避免外部随意修改内部数据,减少代码出错的概率。