pdf文档 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 页请下载阅读 -
文档评分
请文明评论,理性发言.