下面将详细介绍 C++ 中的类和对象,并通过代码示例进行说明。
1. 类 (Class)
-
概念: 类是 C++ 中面向对象编程的核心。它是一种用户自定义的数据类型,用于描述一类具有相同属性(数据成员)和行为(成员函数)的对象。可以将类看作是创建对象的蓝图或模板。
-
作用:
- 封装: 将数据(属性)和操作数据的函数(方法)捆绑在一起,形成一个独立的实体。这有助于隐藏内部实现细节,只暴露必要的接口。
- 抽象: 通过类,我们可以对现实世界中的事物进行抽象,提取出关键特征和行为,忽略不重要的细节。
- 代码复用: 通过创建类的对象,我们可以重复使用类的定义,避免代码冗余。
- 数据保护: 通过访问修饰符(
public
、private
、protected
),可以控制类成员的访问权限,防止外部直接修改类的内部状态。
-
定义:
class ClassName {
// 访问修饰符 (public, private, protected)
// 数据成员 (属性)
// 成员函数 (方法)
};
- 示例:
#include <iostream>
#include <string>
class Dog {
private: //私有成员,只能在类的内部访问
std::string name;
int age;
std::string breed;
public: //公有成员,可以在类的外部访问
// 构造函数 (用于初始化对象)
Dog(std::string n, int a, std::string b) {
name = n;
age = a;
breed = b;
}
// 成员函数 (方法)
void bark() {
std::cout << "Woof!" << std::endl;
}
void displayInfo() {
std::cout << "Name: " << name << std::endl;
std::cout << "Age: " << age << std::endl;
std::cout << "Breed: " << breed << std::endl;
}
// 成员函数,用于设置和获取私有成员
void setName(std::string n){
name = n;
}
std::string getName(){
return name;
}
};
2. 对象 (Object)
- 概念: 对象是类的实例。当我们创建一个类时,我们只是定义了一个数据类型。要使用这个数据类型,我们需要创建该类的对象。可以把对象看作是根据类的蓝图创建的具体实体。
- 创建:
ClassName objectName; // 默认构造函数
ClassName objectName(arguments); // 带参数的构造函数
- 访问成员:
objectName.dataMember; // 访问数据成员
objectName.memberFunction(arguments); // 调用成员函数
- 示例:
使用上面定义的Dog
类
int main() {
// 创建 Dog 类的对象
Dog myDog("Buddy", 3, "Golden Retriever");
Dog yourDog("Lucy", 5, "Labrador");
// 访问对象的成员
myDog.bark(); // 输出: Woof!
myDog.displayInfo();
/*输出:
Name: Buddy
Age: 3
Breed: Golden Retriever
*/
yourDog.setName("Max");
std::cout << yourDog.getName() << std::endl; //输出Max
return 0;
}
3. 访问修饰符
public
: 公有成员可以在类的内部和外部访问。private
: 私有成员只能在类的内部访问。这是实现封装和数据保护的关键。protected
: 受保护成员可以在类的内部以及其派生类(子类)中访问。
4. 构造函数和析构函数
-
构造函数 (Constructor):
- 一种特殊的成员函数,与类同名,没有返回类型。
- 在创建对象时自动调用,用于初始化对象的数据成员。
- 可以重载(有多个不同参数列表的构造函数)。
- 如果没有显式定义构造函数,编译器会提供一个默认构造函数(不带参数)。
-
析构函数 (Destructor):
- 一种特殊的成员函数,与类同名,但在前面加上波浪号 (
~
)。 - 没有返回类型,也没有参数。
- 在对象销毁时(例如,超出作用域或使用
delete
)自动调用,用于释放对象占用的资源(例如,动态分配的内存)。 - 每个类只能有一个析构函数。
- 一种特殊的成员函数,与类同名,但在前面加上波浪号 (
代码示例 (构造函数和析构函数):
#include <iostream>
class MyClass {
private:
int* data;
public:
// 构造函数
MyClass(int size) {
std::cout << "Constructor called" << std::endl;
data = new int[size]; // 动态分配内存
}
// 析构函数
~MyClass() {
std::cout << "Destructor called" << std::endl;
delete[] data; // 释放动态分配的内存
}
};
int main() {
{ // 创建一个作用域
MyClass obj(5); // 创建对象,调用构造函数
} // 对象超出作用域,调用析构函数
return 0;
}
输出结果
Constructor called
Destructor called
总结
类和对象是 C++ 面向对象编程的基础。通过类,我们可以定义自定义数据类型,封装数据和行为,实现代码复用和数据保护。对象是类的实例,我们可以通过对象访问类的成员并执行操作。理解类和对象的概念对于掌握 C++ 编程至关重要。