C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 基础

    • C++ 基础 - 学习路线
    • C++ 基础 - 知识点
    • C++ 基础 - 面向对象
    • C++ 基础 - 语法糖
    • C++ 基础 - 关键字
    • C++ 基础 - 常用宏定义
    • C++ 基础 - 宏函数、内联函数、普通函数
  • 函数

    • C++ 函数 - 闭包
    • C++ 函数 - Linux系统调用Hook
    • C++ 函数 - getopt函数分析以及命令行解析
    • C++ 函数 - 函数指针及其应用
    • C++ 函数 - 作用域运算符::的使用
    • C++ 函数 - 智能指针shared_ptr的使用
    • C++ 函数 - struct结构体学习
    • C++ 函数 - typedef 语句的使用
    • C++ 函数 - va_list函数学习
  • 知识点

    • C++ 知识点 - 写时拷贝技术(copy-on-write)
    • C++ 知识点 - 前向声明(forward declaration)
    • C++ 知识点 - 头文件.h 和 源文件.cpp 以及多重定义(multiple definition)
    • C++ 知识点 - 为什么C语言不支持函数重载,C++又是如何支持的
    • C++ 知识点 - return 局部变量
    • C++ 知识点 - linux下c/cplusplus头文件和动态库的搜索
    • C++ 知识点 - 模板特化与偏特化
  • IO框架

    • C++ IO框架 - I/O 复用
    • C++ IO框架 - select 函数
    • C++ IO框架 - poll 函数
    • C++ IO框架 - epoll 函数
    • C++ IO框架 - Reactor 和 Proactor
  • 新版本特性

    • C++ 新版本特性 - C++11
    • C++ 新版本特性 - C++14
    • C++ 新版本特性 - C++17
    • C++ 新版本特性 - C++20

C++ 知识点 - 前向声明(forward declaration)

本文讲解C++前向声明的含义。

    前向声明: 可以声明一个类而不定义它。这个声明被称为前向声明(forward declaration)。

    • 例如: class name,在声明之后,定义之前,类name是一个不完全类型(incompete type),即已知name是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。类的前向声明只适用于指针和引用的定义,如果是普通类的类型就得使用include了。

    下面来介绍两个类之间的相互引用包含问题,以及如何使用前向声明解决这个问题。

    例1: 类A,类B相互引用定义对象,会导致编译报错,因为存在a.b.a.b.a.b.a.b...,陷入死循环。

    class A
    {
        int i;
        B b;
    }
    class B
    {
         int i;
         A a;
    }
    

    例2: 定义时,相互引用肯定会需要相互包含头文档,但仅仅只是在各自的头文档中包含对方的头文档,是不能通过编译的。如上的包含方式可能会造成编译器有错误提示: A.h文档中使用了未知类型B。

    //class A.h
    #include "B.h"
    class A
    {
         int i;
         B b;
    }
    //class B.h
    #include "A.h"
    class B
    {
        int i;
        A *a;
    }
    

    例3: 两个类的头文档之中,选一个包含另一个类的头文档,但另一个头文件中只能采用class 的申明形式,而在实现文档中(.cpp)中包含头文件。

    //class A.h
    #include "B.h"
    class A
    {
         int i;
         B b;
    }
    //class B.h
    class A;
    class B
    {
        int i;
        A *a;
    }
    //B.cpp
    //在B.cpp中的文档包含处要有下面语句,否则不能调用成员a的任何内容
    #include "A.h"
    B::B()
    {
        ……
    }
    

    当两个类互相包含,且互相在本类中定义另外一个类的对象指针引用时,必须保证当一个类先声明或者定义时才可以在另外一个类中使用。

    Last Updated:
    Contributors: klc407073648
    Prev
    C++ 知识点 - 写时拷贝技术(copy-on-write)
    Next
    C++ 知识点 - 头文件.h 和 源文件.cpp 以及多重定义(multiple definition)