1. C++类与对象基础:封装的起点
当我在大学第一次接触C++的类和对象时,那种从面向过程到面向对象思维的转变让我记忆犹新。封装作为面向对象三大特性之首,是C++从C语言中脱颖而出的关键特性。今天,我想从一个实践者的角度,分享C++类和对象的基础知识,特别是封装这一核心概念。
类和对象是C++区别于C语言的重要特征。简单来说,类就像是一个蓝图,定义了数据的组织方式和操作这些数据的方法;而对象则是根据这个蓝图创建的具体实例。封装则是将数据和对数据的操作捆绑在一起,并对外隐藏实现细节的过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 类的定义与实现
2.1 类的基本结构
一个典型的C++类定义包含以下几个部分:
cpp复制class Student {
private: // 私有成员,只能在类内部访问
std::string name;
int age;
public: // 公有成员,可以在类外部访问
// 构造函数
Student(const std::string& n, int a) : name(n), age(a) {}
// 成员函数
void display() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
// setter和getter
void setName(const std::string& n) { name = n; }
std::string getName() const { return name; }
};
这里有几个关键点需要注意:
private和public是访问修饰符,控制成员的可见性- 构造函数用于初始化对象
- 成员函数可以操作类的数据成员
const成员函数承诺不修改对象状态
2.2 构造函数与初始化
构造函数是类中非常特殊的成员函数,它在对象创建时自动调用。现代C++推荐使用成员初始化列表:
cpp复制// 传统初始化方式(不推荐)
Student(const std::string& n, int a) {
name = n;
age = a;
}
// 使用初始化列表(推荐)
Student(const std::string& n, int a) : name(n), age(a) {}
初始化列表的效率更高,特别是对于const成员和引用成员,必须使用初始化列表。
3. 封装的核心概念
3.1 访问控制
C++提供了三种访问修饰符:
public:任何代码都可以访问private:只有类自己的成员函数可以访问protected:类自己和派生类可以访问
良好的封装实践要求:
- 数据成员通常设为private
- 通过public成员函数提供访问接口
- 只暴露必要的操作给外部
3.2 getter和setter模式
虽然直接访问数据成员更简单,但使用getter和setter有诸多好处:
cpp复制class Temperature {
private:
double celsius;
public:
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32;
}
void setFahrenheit(double f) {
celsius = (f - 32) * 5.0 / 9.0;
}
double getCelsius() const { return celsius; }
void setCelsius(double c) { celsius = c; }
};
这种模式的优势在于:
- 可以在setter中添加验证逻辑
