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功能使用教程
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
上一篇:linux开机流程
上一篇:linux开机流程

