一、头文件(.h):
写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。
在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):
#ifndef CIRCLE_H
#define CIRCLE_H
//你的代码写在这里
#endif
这样做是为了防止重复编译,不这样做就有可能出错。
至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。
这是一个求圆形面积的函数
##################在头文件的文件夹里新建一个名为circle.h的头文件,它的内容如下:
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle
{
private:
double r;//半径
public:
Circle();//构造函数
Circle(double R);//构造函数
double Area();//求面积函数
};
#endif
二、 源文件(.cpp):
源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。
注意到开头结尾的预编译语句。在头文件里,并不写出函数的具体实现。
要给出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类。
三、编译
1、分离式编译
g++ -c circle.cpp -o circle.o
g++ -c main.cpp -o main.o
g++ main.o circle.o -o main
//说明g++指令:
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
-o 制定目标名称
或者一步到位: g++ circle.cpp main.cpp -o main
2、makefile 方式编译
建立名为makefile的文件,内容:
main: main.o circle.o
g++ main.o circle.o -o main
Circle.o:circle.cpp
g++ -c circle.cpp -o circle.o
main.o:main.cpp
g++ -c main.cpp -o main.o
编译:make
两种编译方式选一个之后运行:./main
结果:Area=28.26