C++ 前置声明详解及实例

发布时间 - 2026-01-11 01:43:19    点击率:

C++ 前置声明详解及实例

【1】一般的前置函数声明

见过最多的前置函数声明,基本格式代码如下:

#include <iostream>
using namespace std;

void fun(char ch, int *pValue, double dValue);

void main()
{
  int nValue = 100;
  double dValue = 111.22;
  fun('a', &nValue, dValue);

  system("pause");
}

void fun(char ch, int *pValue, double dValue)
{
  return;
}

很好理解,不做赘述。

【2】自定义类型的前置声明

自定义类型的前置声明,由于编译器不知道类型的大小,所以不可以声明类型的对象。只可以利用类型声明指针和引用。

代码如下:

/*
 * 自定义类型前置声明
 */
#include <iostream>
using namespace std;

class B;

class A 
{
private:
  // 内置类型
  int m_nInt;
  int& m_nRInt;
  int* m_pInt;

  // 自定义类型
//  B b; // error!
  B* m_pB;
  B& m_b;

public: 
  A (B *pBPara = NULL) : m_nInt(100)
    , m_nRInt(m_nInt)
    , m_pInt(NULL)
    , m_pB(NULL)
    , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara))
  {
    cout << "A()" << endl;
  }
  ~A()
  {
    cout << "~A()" << endl;
  }

  void funA()
  {
//    m_pB->doAnything(); // build error C2027: use of undefined type 'B'
  }
};

class B
{
private:
  int m_n;

public: 
  B (int n = 100) : m_n(n)
  {
    cout << "B()" << endl;
  }
  ~B()
  {
    cout << "~B()" << endl;
  }
  void doAnything()
  {
    cout << "B::anythig()" << endl;
  }
};

void main()
{
  A objA;
  system("pause");
}

如上,利用前置类型的指针想调用其成员函数,会报编译错误!那么,肿么办?请看下文。

【3】声明和实现分离

代码如下,声明头文件:

/*
 * TestForwardDeclar.h
 */
#ifndef D_TESTFORWARDDECLAR_H_
#define D_TESTFORWARDDECLAR_H_

#include <iostream>

class B; // 前置声明自定义类型

class A 
{
private:
  // 内置类型
  int m_nInt;
  int& m_nRInt;
  int* m_pInt;

  // 自定义类型
//  B b; // error!
  B* m_pB;
  B& m_b;

public: 
  A (B *pBPara = NULL);
  ~A ();
  void funA();
};

class B
{
private:
  int m_n;

public: 
  B (int n = 100);
  ~B ();
  void doAnything();
};

#endif

代码如下,定义文件:

/*
 * TestForwardDeclar.cpp
 */

#include "TestForwardDeclar.h"
#include <iostream>

A::A (B *pBPara) 
  : m_nInt(100)
  , m_nRInt(m_nInt)
  , m_pInt(NULL)
  , m_pB(NULL)
  , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara))
{
  std::cout << "A()" << std::endl;
}

A::~A()
{
  std::cout << "~A()" << std::endl;
}

void A::funA()
{
  m_pB->doAnything(); // 分开头文件和实现文件即可
}


B::B (int n) : m_n(n)
{
  std::cout << "B()" << std::endl;
}

B::~B()
{
  std::cout << "~B()" << std::endl;
}

void B::doAnything()
{
  std::cout << "B::anythig()" << std::endl;
}

代码如下:测试文件:

#include "TestForwardDeclar.h"
 
 void main()
 {
  A objA;
}

编译成功,运行结果是期望效果。

【4】总结

自定义类型前置声明时,只可以利用类型名声明指针和引用变量(谨记不可以声明对象或new 对象,均因为类型大小不确定,编译器无能为力)。

若需要利用指针或引用调用前置类型的接口,必须按照声明和实现分离的方式进行编码。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++前置声明  # 详解C++前置声明  # 基于C++全局变量的声明与定义的详解  # 深入分析C++中声明与定义的区别  # C++中的extern声明变量详解  # 讲解C++中的枚举类型以及声明新类型的方法  # 详解C++编程中的嵌套类的声明与其中的函数使用  # C++编程中指针的声明与基本使用讲解  # c/c++中变量的声明和定义深入解析  # 详解C++ 前置声明  # C++中显示声明与隐式声明的使用与区别小结  # 自定义  # 会报  # 可以利用  # 头文件  # 很好  # 最多  # 见过  # 不可以  # 希望能  # 不做  # 不确定  # 谢谢大家  # 记不  # 无能为力  # 或引用  # 若需  # 结果是  # double  # dValue  # main 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 北京的网站制作公司有哪些,哪个视频网站最好?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  长沙企业网站制作哪家好,长沙水业集团官方网站?  详解jQuery停止动画——stop()方法的使用  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何使用Vite进行前端资源打包?(配置示例)  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Android okhttputils现在进度显示实例代码  如何在宝塔面板创建新站点?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何快速登录WAP自助建站平台?  Laravel如何记录自定义日志?(Log频道配置)  网站建设整体流程解析,建站其实很容易!  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何快速搭建个人网站并优化SEO?  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  jQuery中的100个技巧汇总  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  JS弹性运动实现方法分析  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  ,在苏州找工作,上哪个网站比较好?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  微信小程序 闭包写法详细介绍  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  太平洋网站制作公司,网络用语太平洋是什么意思?  如何在腾讯云服务器快速搭建个人网站?  使用spring连接及操作mongodb3.0实例  IOS倒计时设置UIButton标题title的抖动问题  LinuxCD持续部署教程_自动发布与回滚机制  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?