1. 类与对象:C++面向对象编程的基石
第一次接触C++的类与对象概念时,我脑海中浮现的是建筑工地上的蓝图与实体房屋的关系。类就像那张详细的设计图纸,而对象则是根据图纸建造出来的实实在在的房子。这种抽象与具象的对应关系,正是面向对象编程(OOP)的核心思想。
在C++中,类(class)是一种用户自定义的数据类型,它封装了数据(称为成员变量)和操作这些数据的函数(称为成员函数)。而对象(object)则是根据类定义创建的实例,每个对象都拥有独立的存储空间来保存其成员变量。这种设计模式让代码更模块化、更易维护,也更能反映现实世界的逻辑关系。
提示:如果你有C语言基础,可以把类理解为struct的增强版——不仅包含数据,还包含操作这些数据的函数。
2. 类的定义与实现
2.1 基本语法结构
一个典型的C++类定义如下:
cpp复制class Student {
private:
// 私有成员(只能在类内部访问)
std::string name;
int age;
public:
// 公有成员(可以在类外部访问)
void setName(std::string n) {
name = n;
}
std::string getName() {
return name;
}
void displayInfo() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
这里定义了一个Student类,包含两个私有成员变量(name和age)和三个公有成员函数。private和public是访问修饰符,控制着类成员的可见性。
2.2 访问控制详解
C++提供了三种访问修饰符:
- private:只能在类内部访问(默认)
- protected:类内部和派生类中可以访问
- public:任何地方都可以访问
良好的类设计通常会:
- 将数据成员设为private,保护数据不被随意修改
- 通过public成员函数提供对数据的受控访问
- 将只在类内部使用的辅助函数设为private
这种设计原则称为"封装",是面向对象的三大特性之一(另外两个是继承和多态)。
3. 对象的创建与使用
3.1 实例化对象
定义了类之后,就可以创建该类的对象了:
cpp复制Student stu1; // 在栈上创建对象
Student* stu2 = new Student(); // 在堆上动态分配对象
两种创建方式的区别:
- 栈对象:生命周期随作用域结束自动销毁
- 堆对象:需要手动delete释放内存
3.2 访问对象成员
访问对象成员使用点运算符(.)或箭头运算符(->):
cpp复制stu1.setName("Alice");
std::cout << stu1.getName() << std::endl;
stu2->setName("Bob");
std::cout << stu2->getName() << std::endl;
3.3 构造函数与析构函数
构造函数在对象创建时自动调用,用于初始化对象:
cpp复制class Student {
public:
// 构造函数
Student(std::string n, int a) : name(n), age(a) {}
// 析构函数
~Student() {
std::cout << "Student对象被销毁" << std::endl;
}
};
使用示例:
cpp复制Student stu("Charlie", 20); // 调用构造函数
// 当stu离开作用域时,自动调用析构函数
4. 类与对象的进阶特性
4.1 this指针
每个成员函数内部都有一个隐含的this指针,指向调用该函数的对象:
cpp复制void Student::setName(std::string name) {
this->name =
