系列目录
上一篇:白骑士的C++教学进阶篇 2.1 指针与引用
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,通过将数据和操作数据的方法封装在对象中来实现代码的重用性、可扩展性和可维护性。C++作为一种面向对象的编程语言,提供了丰富的特性来支持OOP。本篇博客将详细介绍类与对象、构造函数与析构函数、继承与多态、抽象类与接口。
类与对象
类是面向对象编程的核心概念,它定义了一组对象具有的属性和行为。对象是类的实例,通过类来创建对象。类将数据(属性)和方法(行为)封装在一起,提供了对现实世界事物的模拟。
类的定义
在C++中,使用‘class‘关键字定义类。例如,定义一个表示人的类:
class Person {
public:// 属性std::string name;int age;// 方法void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};
在这个例子中,‘Person‘ 类包含两个属性 ‘name‘ 和 ‘age‘,以及一个方法 ‘introduce‘。
对象的创建与使用
通过类来创建对象,并访问对象的属性和方法,例如:
int main() {// 创建对象Person person1;person1.name = "Alice";person1.age = 30;// 调用方法person1.introduce();return 0;
}
在上面的代码中,我们创建了一个 ‘Person‘ 对象 ‘person1‘,并设置了它的属性,最后调用了 ‘introduce‘ 方法。
构造函数与析构函数
构造函数和析构函数是类中的特殊成员函数,分别在对象创建和销毁时自动调用。它们用于初始化和清理对象。
构造函数
构造函数用于初始化对象的属性。它的名称与类名相同,没有返回类型。例如,在 ‘Person‘ 类中添加一个构造函数:
class Person {
public:std::string name;int age;// 构造函数Person(std::string n, int a) {name = n;age = a;}void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};
使用构造函数创建对象,代码如下:
int main() {Person person1("Alice", 30);person1.introduce();return 0;
}
析构函数
析构函数用于清理对象,它的名称与类名相同,但前面加一个波浪号 ‘~‘ ,没有参数和返回类型。例如,在 ‘Person‘ 类中添加一个析构函数:
class Person {
public:std::string name;int age;Person(std::string n, int a) : name(n), age(a) {}~Person() {std::cout << name << " is being destroyed." << std::endl;}void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};
当对象超出作用域时,析构函数会自动调用,代码如下:
int main() {Person person1("Alice", 30);person1.introduce();return 0;
}
继承与多态
继承和多态是OOP的两个重要特性,继承用于创建类的层次结构,实现代码的重用;多态用于动态绑定,允许不同的对象以相同的方式被处理。
继承
继承通过从已有类派生出新类来实现,派生类继承基类的属性和方法。使用‘:‘符号表示继承关系。例如,定义一个表示学生的类,继承自 ‘Person‘ 类:
class Student : public Person {
public:int studentID;Student(std::string n, int a, int id) : Person(n, a), studentID(id) {}void introduce() {std::cout << "Hello, my name is " << name << ", I am " << age << " years old, and my student ID is " << studentID << "." << std::endl;}
};
在上面的代码中,‘Student‘ 类继承了 ‘Person‘ 类的属性和方法,并添加了新的属性 ‘studentID‘。
多态
多态允许使用基类指针或引用来调用派生类的重载方法,实现运行时的动态绑定。使用 ‘virtual‘ 关键字声明虚函数。例如,在 ‘Person‘ 类中声明虚函数 ‘introduce‘:
class Person {
public:std::string name;int age;Person(std::string n, int a) : name(n), age(a) {}virtual void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};
在派生类‘Student‘中重载该虚函数,代码如下:
class Student : public Person {
public:int studentID;Student(std::string n, int a, int id) : Person(n, a), studentID(id) {}void introduce() override {std::cout << "Hello, my name is " << name << ", I am " << age << " years old, and my student ID is " << studentID << "." << std::endl;}
};
使用基类指针或引用调用派生类方法,代码如下:
int main() {Person* person1 = new Student("Alice", 20, 1001);person1->introduce();delete person1;return 0;
}
抽象类与接口
抽象类是不能实例化的类,用于定义接口。抽象类中至少有一个纯虚函数,使用 ‘= 0‘ 语法表示。例如,定义一个抽象类 ‘Shape‘:
class Shape {
public:virtual void draw() = 0; // 纯虚函数
};
派生类必须实现所有纯虚函数。例如,定义一个表示圆形的类:
class Circle : public Shape {
public:void draw() override {std::cout << "Drawing a circle." << std::endl;}
};
使用抽象类指针调用派生类方法,代码如下:
int main() {Shape* shape = new Circle();shape->draw();delete shape;return 0;
}
抽象类和接口(纯虚类)在C++中提供了一种定义标准接口的方法,保证派生类实现特定的行为。
总结
面向对象编程(OOP)是C++的重要特性,通过类与对象、构造函数与析构函数、继承与多态以及抽象类与接口,程序员可以编写更灵活、可扩展和易维护的代码。理解并熟练掌握这些概念和技巧,将大大提高编程能力和效率。希望通过本篇博客的介绍,能更好地理解和应用OOP,为编写复杂和高效的C++程序打下坚实的基础。
下一篇:白骑士的C++教学进阶篇 2.3 模版