 Back to Basics: Object-Oriented Programming
            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 页请下载阅读 -
              
文档评分 
  













