实现部分放在源文件.cpp里面。
模块化实例:
头文件(里边是函数和类的声明)
//Rational.h头文件的名称
//Create by Yuan创建者名字
//头文件作用:这个头文件声明了有理数类(Rational class)
//类里对四则运算进行重数,以实现分数运算
#include<iostream>//需要引进来一个头文件,因为下边用到了std
class Rational
{
public:
Rational(int num,int dencm);//num=分子;dencm=分母;
Rational operator+(Rational rhs);//rhs **
Rational operator-(Rational rhs);
Rational operator*(Rational rhs)
Rational operator/(Rational rhs)
private:
void normalize();//负责对分数的简化处理
int numerator;//分子
int dencminator;//分母
friend std::ostream& operator<<(std::ostream& os,Rational f);
};
win下是.\\。Linux下是./。
源文件:Rational.cpp
#include"Rational.h"
#include<iostream>
#include<stdlib.h>
Rational::Rational(int num,int dencm)//头文件声明中的定义
{
numerator=num;
dencminator=dencm;
normalize();
}
//normalize()//对分数进行简化操作包括:
//1.只允许分子为负数,如果分母为负数则把负数挪到分子部分,如1/-2=-1/2
//2.利用欧几里得算法(辗转求余原理将分数进行简化;2/10=>1/5)
void Rational::normalize()
{
//确保分母为正
if(dencminator<0)
{
numerator=- numerator;
dencminator=-dencminator;
}
}
主函数:main.cpp
#include"Rational.h"
#include<iostream>
int main()
{
Rational f1(2,14);
Rational f2(7,8);
//测试有理数加法运算
std::cout<<f1<<"+"<<f2<<"=="<<(f1+f2)<<"\n";
//测试有理数减法运算
std::cout<<f1<<"-"<<f2<<"=="<<(f1-f2)<<"\n";
//测试有理数乘法运算
std::cout<<f1<<"*"<<f2<<"=="<<(f1*f2)<<"\n";
//测试有理数除法运算
std::cout<<f1<<"/"<<f2<<"=="<<(f1/f2)<<"\n";
return 0;
}
所以把上边头文件进行修改:
//Rational.h头文件的名称
//Create by Yuan创建者名字
//头文件作用:这个头文件声明了有理数类(Rational class)
//类里对四则运算进行重数,以实现分数运算
#ifndef RATIONAL_H
#define RATIONAL_H
#include<iostream>//需要引进来一个头文件,因为下边用到了std
class Rational
{
public:
Rational(int num,int dencm);//num=分子;dencm=分母;
Rational operator+(Rational rhs);//rhs **
Rational operator-(Rational rhs);
Rational operator*(Rational rhs)
Rational operator/(Rational rhs)
private:
void normalize();//负责对分数的简化处理
int numerator;//分子
int dencminator;//分母
friend std::ostream& operator<<(std::ostream& os,Rational f);
};
#endif
从上边的Rational.cpp头文件和主函数main.cpp都引用了头文件Rational.h。同时引用的过程我们在main函数第一次编译的时候他已经引用他了(第一次执行Rational.h会被编译,他肯定还没有定义RATIONAL_H这个常量,那我们就定义它并执行以下的内容,知道#endif);再来到Rational.cpp的时候他也引用了Rational.h这个头文件,就又进入这个头文件,这个时候RATIONAL_H这个常量已经被定义过了,下边的内容就都不会被执行了,直接来到#endif的地方。
把上述Rational这个类修改成在自己的命名空间下:
//Rational.h头文件的名称
//Create by Yuan创建者名字
//头文件作用:这个头文件声明了有理数类(Rational class)
//类里对四则运算进行重数,以实现分数运算
#ifndef RATIONAL_H
#define RATIONAL_H
#include<iostream>//需要引进来一个头文件,因为下边用到了std
namespace Mymath
{
class Rational
{
public:
Rational(int num,int dencm);//num=分子;dencm=分母;
Rational operator+(Rational rhs);//rhs **
Rational operator-(Rational rhs);
Rational operator*(Rational rhs)
Rational operator/(Rational rhs)
private:
void normalize();//负责对分数的简化处理
int numerator;//分子
int dencminator;//分母
friend std::ostream& operator<<(std::ostream& os,Rational f);
};
}
#endif
那么在Rational.cpp和main.cpp就引用不到了,就需要在这Rational.cpp(在这个文件中是对他的使用)文件中也要使用命名空间把他们括起来(就是把声明和定义把他括起来),那么在main函数中是调用他的,那我们就可以使用using namespace Mymath;或者每次使用都是用Mymath::这样的方式。
-----------链接和作用域
翻译单元就是把源文件编译之后的东西叫做翻译单元。
在函数里定义的变量只存在于该函数的内部,根本没有任何链接。
(1)static是静态成员他是存放在他自己的源文件里边,他不会被其他源文件动摇。
(2)由于使用了extern,所以这里可以把thatNum给整过来(因为thatNum是在that.cpp中中声明的全局变量嘛,所以使用了extern把他给拉过来了)。
(3)不要在头文件里边定义变量,生命就行了。如果我们非要定义的话就把他声明为static类型(就意味着这个变量只有内链接,只存在this.cpp这个翻译单元里边),我们还不想让它改变就用const把他给固定住。