类和对象是C++面向对象编程的核心,可以将数据与操作封装为对象。
一、类的定义
使用class关键字可以定义一个类:
class Person {
// 字段
string name;
int age;
// 方法
void printInfo() {
//...
}
};
类包含数据字段和方法。
二、对象的创建
类定义后可以创建对象:
Person p1;
p1.name = "John";
p1.age = 20;
对象包含类定义的数据和方法。
三、访问控制
public为公开访问,private为私有只能类内部访问:
class Person {
public:
string name;
private:
int age;
};
四、构造和析构
构造函数在创建对象时调用,析构函数在删除对象时调用。
在 C++中,构造函数和析构函数是用于对象的创建和销毁的特殊函数。
- 构造函数:构造函数是类的一个特殊成员函数,用于在创建对象时初始化对象的成员变量。构造函数的名称与类名相同,并且没有返回类型。在创建对象时,会自动调用构造函数。
下面是一个简单的构造函数示例:
class MyClass {
public:
MyClass(int x) {
// 初始化成员变量
m_x = x;
}
private:
int m_x;
};
在上面的代码中,MyClass
类有一个构造函数MyClass(int x)
,它接受一个整数参数x
,并将其赋值给成员变量m_x
。当创建MyClass
对象时,可以指定整数参数来初始化成员变量。
例如,可以这样创建一个MyClass
对象:
MyClass obj(10); // 创建一个 m_x 为 10 的 MyClass 对象
- 析构函数:析构函数是类的另一个特殊成员函数,用于在对象被销毁时释放对象占用的资源。析构函数的名称与类名相同,但前面加上了波浪号
~
,并且没有返回类型。在对象被销毁时,会自动调用析构函数。
下面是一个简单的析构函数示例:
class MyClass {
public:
~MyClass() {
// 释放资源
}
private:
int* m_pData;
};
在上面的代码中,MyClass
类有一个析构函数~MyClass()
,它没有参数。在析构函数中,可以释放对象占用的资源,例如释放动态分配的内存。
例如,如果m_pData
是一个动态分配的内存指针,可以这样释放它:
~MyClass() {
delete m_pData;
}
需要注意的是,构造函数和析构函数是非常重要的,它们确保了对象的正确创建和销毁,避免了资源泄漏等问题。在编写类时,应该根据需要定义适当的构造函数和析构函数。
五、继承
类可以通过继承重用基类数据和方法:
class Student : public Person {
// 继承Person
};
六、多态
多态是 C++面向对象编程的一个重要特性,它允许不同的对象以不同的方式响应相同的消息或操作。多态的实现依赖于虚函数和继承。
下面是一个简单的多态示例代码,演示了多态的概念:
class Shape {
public:
virtual void draw() {
// 抽象方法,需要子类实现
}
};
class Circle : public Shape {
public:
void draw() override {
// 具体实现
std::cout << "绘制圆形\n";
}
};
class Square : public Shape {
public:
void draw() override {
// 具体实现
std::cout << "绘制正方形\n";
}
};
int main() {
Circle circle;
Square square;
circle.draw(); // 绘制圆形
square.draw(); // 绘制正方形
return 0;
}
在上面的代码中,Shape
类是一个抽象类,它有一个虚函数draw()
。Circle
和Square
类都是Shape
类的子类,它们分别实现了draw()
函数的具体行为。
在main()
函数中,创建了Circle
和Square
对象,并分别调用它们的draw()
函数。由于draw()
函数是虚函数,所以在运行时会根据对象的实际类型来调用相应的实现。因此,当调用circle.draw()
时,会输出”绘制圆形”,而调用square.draw()
时,会输出”绘制正方形”。
多态的优点是可以提高代码的灵活性和可扩展性。通过将公共的行为抽象到基类中,并让子类实现具体的行为,可以使代码更加模块化和可复用。同时,多态也使得代码更加易于维护和扩展,因为可以在不修改现有代码的情况下添加新的子类和行为。
类和对象是C++面向对象编程的基石,必须完全掌握。