C++中头文件(.h)和源文件(.cpp)都应该写些什么

来源:互联网 发布:windows app文件夹 编辑:程序博客网 时间:2024/04/29 18:17


   头文件(.h):

    写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。

    在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):

 

#ifndef CIRCLE_H
#define CIRCLE_H

//你的代码写在这里

#endif

 

    这样做是为了防止重复编译,不这样做就有可能出错。

    至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。

   源文件(.cpp):

    源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。

    下面举个最简单的例子来描述一下,咱就求个圆面积。

     第1步,建立一个空工程(以在VS2003环境下为例)。

     第2步,在头文件的文件夹里新建一个名为Circle.h的头文件,它的内容如下:

 

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle
{
private:
    
double r;//半径
public:
    Circle();
//构造函数
    Circle(double R);//构造函数
    double Area();//求面积函数
}
;

#endif

   注意到开头结尾的预编译语句。在头文件里,并不写出函数的具体实现。

    第3步,要给出Circle类的具体实现,因此,在源文件夹里新建一个Circle.cpp的文件,它的内容如下:

 

#include "Circle.h"

Circle::Circle()
{
    
this->r=5.0;
}


Circle::Circle(
double R)
{
    
this->r=R;
}


double Circle:: Area()
{
    
return 3.14*r*r;
}

    需要注意的是:开头处包含了Circle.h,事实上,只要此cpp文件用到的文件,都要包含进来!这个文件的名字其实不一定要叫Circle.cpp,但非常建议cpp文件与头文件相对应。

    最后,我们建一个main.cpp来测试我们写的Circle类,它的内容如下:

 

#include <iostream>
#include 
"Circle.h"
using namespace std;

int main()
{
    Circle c(
3);
    cout
<<"Area="<<c.Area()<<endl;
    
return 1;
}

    注意到开头时有#include "Circle.h"的声明,证明我们使用到了我们刚才写的Circle类。

   至此,我们工程的结构为:

    运行一下,输出结果为:

   说明我们写的Circle类确实可以用了。

   头文件(.h):

    写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。

    在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):

 

#ifndef CIRCLE_H
#define CIRCLE_H

//你的代码写在这里

#endif

 

    这样做是为了防止重复编译,不这样做就有可能出错。

    至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。

   源文件(.cpp):

    源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。

    下面举个最简单的例子来描述一下,咱就求个圆面积。

     第1步,建立一个空工程(以在VS2003环境下为例)。

     第2步,在头文件的文件夹里新建一个名为Circle.h的头文件,它的内容如下:

 

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle
{
private:
    
double r;//半径
public:
    Circle();
//构造函数
    Circle(double R);//构造函数
    double Area();//求面积函数
}
;

#endif

   注意到开头结尾的预编译语句。在头文件里,并不写出函数的具体实现。

    第3步,要给出Circle类的具体实现,因此,在源文件夹里新建一个Circle.cpp的文件,它的内容如下:

 

#include "Circle.h"

Circle::Circle()
{
    
this->r=5.0;
}


Circle::Circle(
double R)
{
    
this->r=R;
}


double Circle:: Area()
{
    
return 3.14*r*r;
}

    需要注意的是:开头处包含了Circle.h,事实上,只要此cpp文件用到的文件,都要包含进来!这个文件的名字其实不一定要叫Circle.cpp,但非常建议cpp文件与头文件相对应。

    最后,我们建一个main.cpp来测试我们写的Circle类,它的内容如下:

 

#include <iostream>
#include 
"Circle.h"
using namespace std;

int main()
{
    Circle c(
3);
    cout
<<"Area="<<c.Area()<<endl;
    
return 1;
}

    注意到开头时有#include "Circle.h"的声明,证明我们使用到了我们刚才写的Circle类。

   至此,我们工程的结构为:

    运行一下,输出结果为:

   说明我们写的Circle类确实可以用了。


本质上,它们都是文本文件。重要的是其中你写的代码,不管你命名为.cpp还是命名为.abc,本质都不变
为了方便,我们一般使用.cpp后缀名来表示这个文件里面的文本是C++代码

编译器编译代码的时候首先先编译各模块,然后再将各模块链接为最终的可执行程序
一般来说,一个文件就编译为一个模块
但是,各模块要能链接到一起,必须有一些共同的地方,例如模块A里面有一个函数,模块B想要使用这个函数,它就必须知道模块A的一些信息才行。体现在代码上,就是有些代码必须在几个文件里都写一遍
此时我们将这样的代码写在一个单独的文本文件里,后缀名使用.h或者.hpp来表示,并使用#include来将这个文件里面的代码包含到需要这段代码的.cpp文件中

这就是.h文件和.cpp文件的由来
后者是本质,前者是工具。模块内的执行代码,写在.cpp文件里;用于表示模块信息的代码,写在.h文件里,并被数个.cpp文件包含

如果你使用gcc等编译器手动编译链接各模块,那么后缀名没有任何意义,只供你观赏
如果你使用VS等自动化的开发环境,那么它编译程序的时候,会按照后缀名编译,简单地说,就是它编译全部.cpp文件,且只编译.cpp文件



   头文件(.h):

    写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。

    在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):

 

#ifndef CIRCLE_H
#define CIRCLE_H

//你的代码写在这里

#endif

 

    这样做是为了防止重复编译,不这样做就有可能出错。

    至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。

   源文件(.cpp):

    源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。

    下面举个最简单的例子来描述一下,咱就求个圆面积。

     第1步,建立一个空工程(以在VS2003环境下为例)。

     第2步,在头文件的文件夹里新建一个名为Circle.h的头文件,它的内容如下:

 

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle
{
private:
    
double r;//半径
public:
    Circle();
//构造函数
    Circle(double R);//构造函数
    double Area();//求面积函数
}
;

#endif

   注意到开头结尾的预编译语句。在头文件里,并不写出函数的具体实现。

    第3步,要给出Circle类的具体实现,因此,在源文件夹里新建一个Circle.cpp的文件,它的内容如下:

 

#include "Circle.h"

Circle::Circle()
{
    
this->r=5.0;
}


Circle::Circle(
double R)
{
    
this->r=R;
}


double Circle:: Area()
{
    
return 3.14*r*r;
}

    需要注意的是:开头处包含了Circle.h,事实上,只要此cpp文件用到的文件,都要包含进来!这个文件的名字其实不一定要叫Circle.cpp,但非常建议cpp文件与头文件相对应。

    最后,我们建一个main.cpp来测试我们写的Circle类,它的内容如下:

 

#include <iostream>
#include 
"Circle.h"
using namespace std;

int main()
{
    Circle c(
3);
    cout
<<"Area="<<c.Area()<<endl;
    
return 1;
}

    注意到开头时有#include "Circle.h"的声明,证明我们使用到了我们刚才写的Circle类。

   至此,我们工程的结构为:

    运行一下,输出结果为:

   说明我们写的Circle类确实可以用了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玩刺激战场带耳机声音有延迟怎么办 我的世界手机版狼变色怎么办 我的世界开了光影太阳太刺眼怎么办 我的世界饥饿值掉的慢怎么办 我的世界合装备过于昂贵怎么办 我的世界故事模式屏幕是黑的怎么办 人物只剩下轮廓的图用ps怎么办 两年义务兵考军校分数不够怎么办 大学生兵考上军校后原学籍怎么办 我的世界工业附魔到精准采集怎么办 交换生在台期间遗失通行证怎么办 驾驶证上的号码是士兵证号怎么办 士兵证丢了但是要买飞机票怎么办 君泰保安公司不发工资怎么办 冬天洗棉衣后有一圈白色怎么办 买了一批化肥没有执行标准怎么办 防护栏下面打不了膨胀螺丝怎么办 不知道怀孕照了x射线怎么办 腹部照了x光片照了三次怎么办 像在工厂戴的静电帽弄丢了怎么办 诈骗犯把钱被转到别人账户怎么办 狗狗5个月在家随地大小便怎么办 上课放屁放的快没憋到老是放怎么办 丈夫有外遇并跟小三有一儿子怎么办 借款夫妻双亡借出去的钱怎么办? 橡胶底的劳保鞋开胶了怎么办? 求部队停止有偿服务内部超市怎么办 晋江买了全本还是有防盗章节怎么办 宝宝没有穿衣服的地方长疙瘩怎么办 詹姆斯士兵12魔术贴老是掉怎么办 手机版本不支持陌陌视频聊天怎么办 私人单位不给员工写收入证明怎么办 cad图形缩小后找不到图了怎么办 离婚了老婆嫁给了别人怎么办 对方开车撞伤人逃逸不赔钱怎么办 帮老板开车撞伤人老板不愿赔怎么办 我开车撞人现在伤者住院怎么办 B照驾驶证扣3分怎么办l 驾驶证被盗后被别人拿去消分怎么办 碰瓷的手碰我后视镜怎么办 摩托被盗监控录像器没有记录怎么办