一、什么是面向对象 OOP

面向对象是一种编程思想,把现实事物抽象成,用对象来使用。核心思想:万物皆对象

:抽象模板(图纸)对象:类的实例(造出来的产品)


二、面向对象三大核心特性

1. 封装

把数据和方法打包在一起,对外隐藏细节,只暴露必要接口

  • 成员变量私有化 private
  • 提供 public 的 get/set 方法访问
  • 好处:安全、易维护、代码可控

2. 继承

子类复用父类的属性和方法,避免重复代码

  • 三种继承方式:
    • public 公有继承
    • protected 保护继承
    • private 私有继承
  • 好处:代码复用、便于扩展、层次清晰

3. 多态

一个接口,多种实现分为两种:

  • 静态多态(编译期):函数重载、运算符重载
  • 动态多态(运行期):虚函数 + 重写 + 父类指针指向子类对象好处:程序扩展性强,开闭原则

三、类与对象基础

1. 类的组成

  • 成员变量:属性
  • 成员函数:行为

2. 访问权限修饰符

  1. private:私有,本类内部可访问,外界不能
  2. protected:保护,本类 + 子类可访问
  3. public:公有,任何地方都能访问

3. 对象创建

cpp

运行

Person p;              // 栈对象
Person* p = new Person;// 堆对象

四、构造函数与析构函数

构造函数

  • 名字和类名相同,无返回值
  • 创建对象自动调用分类:
  • 无参构造
  • 有参构造
  • 拷贝构造
  • 移动构造
  • 委托构造

析构函数

  • 名字加 ~,无参数无返回
  • 对象销毁自动调用
  • 作用:释放资源、关闭文件、释放堆内存
  • 多态场景必须写虚析构 virtual ~Person()

浅拷贝 & 深拷贝

  • 浅拷贝:只拷贝地址,多个对象共用同一块堆内存,容易重复释放
  • 深拷贝:重新开辟内存,各自独立,安全

五、this 指针

  • 每个成员函数隐含 this 指针
  • 指向当前调用的对象
  • 用途:
    1. 区分成员变量和局部变量重名
    2. 返回自身对象
    3. 在类内访问自身成员

六、静态成员 static

静态成员变量

  • 属于,不属于单个对象
  • 所有对象共享同一份
  • 内存全局只一份,提前初始化

静态成员函数

  • 只能访问静态成员
  • 没有 this 指针
  • 可以类名::函数名 直接调用

七、继承详解

继承语法

cpp

运行

class 子类 : 继承方式 父类 { };

继承访问变化

  • public 继承:父类 public→子类 public,protected→protected
  • protected 继承:父类 public/protected 都变成子类 protected
  • private 继承:父类 public/protected 都变成子类 private

构造析构顺序

父类构造 → 子类构造子类析构 → 父类析构

菱形继承问题

  • 多继承造成二义性
  • 存在数据冗余解决:虚继承 virtual

八、多态详解(重点)

实现条件

  1. 继承关系
  2. 子类重写父类虚函数
  3. 父类指针 / 引用 指向子类对象

虚函数

cpp

运行

virtual void show();

纯虚函数 & 抽象类

cpp

运行

virtual void show() = 0;
  • 包含纯虚函数的类叫抽象类
  • 不能实例化对象,只能被继承

虚函数表 vtable

  • 每个含虚函数的类,有一张虚函数表
  • 对象内部有 vptr 虚指针,指向虚表
  • 运行时通过虚表找到真正调用的子类函数

九、常成员与 const

  1. 常成员函数:不修改成员变量

cpp

运行

void fun() const;
  1. 常对象:只能调用常成员函数
  2. const 成员变量:只能在初始化列表初始化

十、友元

  • friend 友元函数、友元类
  • 可以突破访问权限,访问类私有成员
  • 破坏封装,尽量少用

十一、面向对象设计原则

  • 封装:隐藏实现,暴露接口
  • 继承:代码复用
  • 多态:灵活扩展,一套接口多种实现

极简背诵总结

类是模板,对象是实例;三大特性:封装、继承、多态;构造造对象,析构释资源;虚函数实现动态多态,虚析构防止内存泄漏;static 属于类,this 指向当前对象;继承有三种权限,菱形继承用虚继承解决。

更多推荐