c++头
头文件c/c++独特的概念。
首先解释声明和定义的区别。
extern int x;这是一个可变x声明,void fun();这是函数fun()声明。class a;这是类a声明。
int x;变量x定义。void fun(){};则为fun()函数的定义,class a{};则为类a的定义。
头文件里存放预处理命令(#开头的命令),函数声明。类、结构体、联合定义(不能实例化对象),模板定义等。
而不应该包括变量定义。函数定义等。头文件里的内容不会去生成目标代码。不会去为变量声明或类定义分配内存空间,都仅仅是一些声明性的东西。#include在编译的预编译阶段展开用对应的头文件内容替换。
编译单元是指一个cpp文件。能够生成一个目标文件。同一个编译单元中能够有反复的声明,可是不同意反复的变量定义、函数定义、类定义。不同的编译单元能够有反复的声明和类定义(这里比較特殊,由于类定义仅仅是声明性的东西,没有实际产生目标代码,故能够放在不同的编译单元中,而在同一编译单元中不能反复定义),不同意反复的变量定义和函数定义。
为了防止在同一个编译单元中头文件反复引用导致出现类反复定义等问题,在每一个头文件定义时增加#ifndef #define #endif的定义。
而且该条件编译指令也能够避免头文件的循引用,在程序预编译阶段,碰到#include命令即展开相应的头文件。在展开那个头文件时同理处理。
比方有三个头文件a.h b.h c.h,a.h里面有#include "b.h",b.h里面有#include "c.h", c.h里面有#include "a.h",这就会造成文件的循环依赖,此时若有个文件a.c。当中#include
"a.h"。那在a.c文件编译之前,预处理程序就会不断的把这三个头文件的内容复制过来。超过了一定的数量,就会导致“头文件数太多”的编译错误。当使用#ifndef...#define...#endif条件编译命令后,第一次展开a.h b.h c.h的时候就已经定义了宏,到了c.h中的#include "a.h"时候,遇到了#ifndef。因为这个宏在上一次展开时已经定义了,所以这部分就跳过去了。也就是每一个头文件最多仅仅在每一个源文件中面包括一次。
以下解决一个实际问题即两个类A,B中都有还有一个类的指针。即彼此互相引用。这里能够用前置声明来解决。
头文件a.h
#ifndef A_H
#define A_H
class B;
class A
{
public:
B* b;
};
#endif
头文件b.h
#ifndef B_H
#define B_H
class A;
class B
{
public:
A* a;
};
#endif
使用头文件时的两个原则:
1、假设能够不包括头文件,那就不要包括了。这时候前置声明能够解决这个问题。假设使用的不过一个类的指针,没有使用这个类的详细对象(非指针),也没有訪问到类的详细成员。那么前置声明就能够了。
由于指针这一数据类型的大小是特定的。编译器能够获知。
2、尽量在CPP文件里包括头文件,而非在头文件里。如果类A的一个成员是是一个指向类B的指针,在类A的头文件里使用了类B的前置声明并 廉价成功。那么在A的实现中我们须要訪问B的详细成员,因此须要包括头文件。那么我们应该在类A的实现部分(CPP文件)包括类B的头文件而不是声明节
版权声明:本文博客原创文章,博客,未经同意,不得转载。
c++头的更多相关文章
- HTTP1.1协议-RFC2616-中文版课前资料收集
1.http rfc大致讲了什么? 2.解决了什么问题? HTTP协议描述的是发送方与接收方的通信协议 协议功能: HTTP协议(HyperText Transfer Protocol,超文本传输协议 ...
- HTTP1.1协议-RFC2616-中文版
转自:http://www.cnblogs.com/k1988/archive/2010/01/12/2165683.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善. ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 【WCF】自定义地址头的筛选器
前面的文章中,老周已向大伙伴们介绍了如何在终结点上使用地址头,只要服务是沿着该终结点调用的,那么每一次调用都会自动把地址头插入到SOAP消息的Header列表中. 而通过前一篇文章中的示例,大家也看到 ...
- 【WCF】为终结点地址应用地址头
记得不久前,老周写过博文,探讨过在ContextScope以一定的范内向发出的消息中插入消息头,scope只能为特定的某一次服务操作的调用而添加SOAP头,要是需要在每次调用操作协定的时候都插上Hea ...
- C# listview 单击列头实现排序 <二>
单击列头实现排序,首先在羡慕中添加下面的帮助实现的类:具体的代码: using System; using System.Collections; using System.Windows.Forms ...
- 仿喜马拉雅实现ListView添加头布局和脚布局
ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...
- 【转】你所不知道的HTML <head/> 头标签
HTML的头部内容特别多,有针对SEO的头部信息,也有针对移动设备的头部信息.而且各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,有很多差异性.移动端的工作已经越来越成为前端工作的重要内容, ...
- 【C】.h头文件的重复包含问题
.h头文件存在的意义就是封装,可以方便多个.c源文件使用,但要防止.h头文件被同一个.c源文件多次包含. 例如, io.h文件 #ifndef _IO_H_ #define _IO_H_ #defin ...
- CMakeList.txt/Clion中添加头文件和库
cmake_minimum_required(VERSION 3.6) project(capi_lua) include_directories(/usr/include) find_library ...
随机推荐
- Hbase经常使用命令
hbase shell命令的使用 再使用hbase 命令之前先检查一下hbase是否执行正常 hadoop@Master:/usr/hbase/bin$ jps 2640 HMaster 27170 ...
- java多线程:ReentrantReadWriteLock读写锁使用
Lock比传统的线程模型synchronized更多的面向对象的方式.锁和生活似,应该是一个对象.两个线程运行的代码片段要实现同步相互排斥的效果.它们必须用同一个Lock对象. 读写锁:分为读锁和写锁 ...
- TopCoder SRM 625 Incrementing Sequence 题解
本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序. 能够从暴力法入手,然后优化. 这里利用hash表进行优化,终于得到时间效 ...
- [置顶] C++学习书单
关于C++的书太多了,很容易让人没有头绪.一直想整理下,把这些书列个书单出来,直到今天才动手.希望我的经验能给后来的初学者一点帮助. 1.<C++程序设计教程> 钱能 很多学校把这本书选做 ...
- hdu1992(递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1992 题意:用1*2和2*1的小长方形铺垫4*W的方格有多少种方法. 分析:假如新加入1列,这列都竖着 ...
- HTML——UL+CSS设计
截图例如,下面的: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ ...
- 64位CentOS5.6安装Mysql 5.5.11GA
1.更新并查看当前CentOS版本是否为5.6yum updatelsb_release -a 2.下载文件下载 bison-2.4.3.tar.gz到/usr/local/src下载 cmake-2 ...
- leetcode:linked_list_cycle_II
一. 题目 给定一个链表,假设链表中有环则返回环的開始节点,否则返回NULL.要求不用额外的空间完毕. 二. 分析 在I中,我们推断环的存在,即用slow和fast两个指针,设定步长f ...
- lightoj1030(期望dp)
有n个格子,初始的时候pos=1,然后丢骰子,然后新的pos为pos+骰子的点数,走到新的pos,可以捡走该pos上的黄金. 特殊的是,如果新的pos超过了n,那么是不会走的,要重新丢骰子. 所以要分 ...
- WPF换肤之二:可拉动的窗体
原文:WPF换肤之二:可拉动的窗体 让我们接着上一章: WPF换肤之一:创建圆角窗体 来继续. 在这一章,我主要是实现对圆角窗体的拖动,改变大小功能. 拖动自绘窗体的步骤 首先,通过上节的设计,我们知 ...