Back to Basics: Object-Oriented Programming
1.04 MB
20 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
英语 | .pdf | 3 |
摘要 | ||
本文档系统介绍了C++面向对象编程的基础知识,包括类的定义与使用、成员函数、访问修饰符(public、protected、private)、构造函数和析构函数的作用及实现方法。文档还讨论了虚函数的应用及其在多态中的角色,展示了如何通过虚析构函数确保多态删除。最后,提供了良好的类设计原则,如优先使用值类型、避免虚函数的默认参数、正确处理对象切片以及合理声明虚析构函数。 | ||
AI总结 | ||
《Back to Basics: Object-Oriented Programming》总结
本文档围绕C++面向对象编程(OOP)基础知识展开,涵盖了类的定义、继承、多态、虚函数、构造函数与析构函数、默认参数以及类设计原则等内容。以下是核心内容的总结:
### 1. 类的基础概念
- **类与结构体**:类和结构体的主要区别在于成员的默认访问权限,类的默认为`private`,而结构体为`public`。
- **成员函数与数据**:类可以包含成员函数(方法)和数据成员,且成员的访问权限通过`public`、`protected`、`private`指定。
- **构造函数**:构造函数用于初始化对象,数据成员应尽量在构造函数的初始化列表中进行初始化。
- **常函数**:`const`关键字用于修饰不会修改对象状态的成员函数。
示例:
```cpp
class Apple {
public:
explicit Apple(int i) : mData(i) {} // 构造函数,数据初始化
void Set(int i) { mData = i; } // 非常成员函数
auto Get() const { return mData; } // 常成员函数
private:
int mData{}; // 数据成员
};
```
### 2. 虚函数与多态
- **虚函数**:基类中使用`virtual`关键字声明的函数,可以在派生类中被重写(override)。
- **多态**:通过基类指针或引用调用虚函数时,实际调用的是派生类的实现。
- **析构函数**:基类的析构函数应声明为`virtual`,以支持多态删除。
示例:
```cpp
struct Fruit {
virtual ~Fruit() { puts("~Fruit"); } // 虚析构函数
virtual void Print() { puts("Fruit's Print"); } // 虚函数
};
struct Apple : Fruit {
void Print() override { printf("Apple's Print: %d\n", mRipeGrade); } // 重写虚函数
};
```
### 3. 构造函数与析构函数
- **默认参数**:函数参数可以有默认值,调用时可省略部分参数。
- **默认构造函数**:如果类没有显式定义构造函数,编译器会生成默认构造函数。
- **移动语义**:C++11引入了移动构造函数和移动赋值运算符,用于优化资源管理。
- **虚析构函数**:基类必须声明虚析构函数,以避免内存泄漏和未定义行为。
示例:
```cpp
class String final {
public:
String() = default; // 默认构造函数
~String(); // 用户声明析构函数
String(const String&); // 拷贝构造函数
String& operator=(const String&); // 拷贝赋值运算符
String(String&&); // 移动构造函数
String& operator=(String&&); // 移动赋值运算符
};
```
### 4. 类设计原则
- **值类型优先**:尽量使用值类型而非引用类型。
- **访问权限**:数据成员应尽量为`private`,避免`public`暴露细节。
- **多态与虚函数**:基类中若有虚函数,必须声明虚析构函数。
- **继承设计**:类应明确设计为可继承或不可继承。
- **避免对象切割**:避免将派生类对象赋值给基类对象,防止丢失派生类部分。
示例:
```cpp
struct IOPort {
virtual ~IOPort() { puts("IOPort dtor"); } // 虚析构函数
virtual void Flush() { puts("IOPort Flush"); } // 虚函数
protected:
IOPort(const IOPort&) = default; // 拷贝构造函数
IOPort& operator=(const IOPort&) = default; // 拷贝赋值运算符
};
```
### 5. 模板方法模式
- **模板方法**:通过基类定义算法的框架,而具体步骤由派生类实现。
- **纯虚函数**:使用`= 0`声明纯虚函数,确保派生类必须实现。
示例:
```cpp
struct Sort {
void process() {
read(); // 读取数据
sort(); // 排序
write(); // 写回
protected:
virtual void read() = 0; // 纯虚函数
virtual void sort() = 0; // 纯虚函数
virtual void write() = 0; // 纯虚函数
};
class QuickSort : public Sort {
protected:
void read() override { puts("read"); }
void sort() override { puts("sort"); }
void write() override { puts("write"); }
};
```
### 6. 默认参数与虚函数
- **默认参数**:函数参数的默认值应在函数声明中指定。
- **虚函数与默认参数**:基类和派生类的虚函数默认参数应保持一致,避免潜在问题。
示例:
```cpp
struct Car {
virtual ~Car() = default;
virtual void Drive(eDirect d = eDirect::Bwd) const = 0; // 基类虚函数
};
struct Tesla : public Car {
void Drive(eDirect d) const override { printf("Tesla: %d\n", d); } // 重写虚函数
};
```
### 总结
文档强调了C++面向对象编程的核心概念和设计原则,通过代码示例和实际案例,帮助读者理解类的定义、继承、多态、虚函数、构造函数与析构函数等关键内容,并提出了设计高质量类的指导原则。 |
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余
8 页请下载阅读 -
文档评分