C++笔记(十二)——头文件(.h)和源文件(.cpp)写法

        用C++编写比较大型的项目时,文件的分割管理确实确实是非常必要的 。下面就非常简洁明了地谈谈头文件(.h)和源文件(.cpp)应该怎么写。

       在.h文件中,主要是进行类的定义,包括数据成员和函数成员的声明(成员函数的定义也可以在这个文件中进行),一般类的数据成员被声明为私有的,函数成员被声明为公有的。在.cpp文件中进行变量的赋值和函数的实例化。细分的话,通常main.cpp文件进行的是类成员函数的实例化,涉及到类的调用、类中形参的输入、输出结果等。跟头文件名相同的.cpp文件,主要是进行成员函数的具体定义。如下表所示:

C++

项目

.h文件文件名.h(Student.h)

主要是进行类的声明,包括数据成员和函数成员的声明(成员函数的定义也可以在这个文件中进行),一般类的数据成员被声明为私有的,函数成员被声明为公有的。注:在程序开头要加上预编译语句:

#ifndef __大写文件名_H__

.cpp文件

main.cpp

进行的是类成员函数的实例化,涉及到类的调用、类中形参的输入、输出结果等
文件名.cpp(Student.cpp)进行成员函数的具体定义
  • 头文件(.h):

        写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。 
在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):

#ifndef CIRCLE_H
#define CIRCLE_H

//你的代码写在这里

#endif

        这样做是为了防止重复编译,不这样做就有可能出错。 
        至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。

注:

  • 1)头文件中只能写声明,不能写定义;
  • 2)const常量例外,其定义可以写在头文件里;
  • 3)头文件不要太大,千行以内。

  • 源文件(.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;
}

运行一下,测试结果。


再来一个具体的关于登记学生成绩信息的例子,直接抛代码:

STU.h文件:

#ifndef __STU_H__
#define __STU_H__

#include <iostream>
#include <cstring>

using namespace std;

class CStu{  //类名以大写字母c开头
private:
	int m_num; //成员变量以“m_”为前缀
	char m_name[32];

public:
	void setNum(int x);
	int getNum(void);

	void setName(char *str);
	char* getName(void);

};

#endif

STU.cpp文件:

#include <string>
#include "STU.h"

void CStu::setNum(int x)
{
	m_num = x;
	return;
}
int CStu::getNum(void)
{
	return m_num;
}

void CStu::setName(char *str)
{
	strcpy(m_name, str);

	return;
}
char* CStu::getName(void)
{
	return m_name;
}

main.cpp文件

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

using namespace std;

int main()
{
	//实例化对象
	CStu Lucy;
	CStu Bob;

	Lucy.setNum(100);
	Lucy.setName((char *)"Lucy");
	Bob.setNum(30);
	Bob.setName((char *)"Bob");

	cout << "Lucy.num = " << Lucy.getNum() << endl;
	cout << "Lucy.name = " << Lucy.getName() << endl;
	cout << "Bob.num = " << Bob.getNum() << endl;
	cout << "Bob.name = " << Bob.getName() << endl;

	getchar();
	return 0;
}

 

参考文章:

https://blog.csdn.net/qq457163027/article/details/53468478

  • 18
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值