模块化:把程序划分成多个组成部分(即所谓的模块)。这是通过把程序代码分散到多个文件里,等编译程序时再把那些文件重新组合在一起实现的。
C++预处理器的#include指令提供了一种能够让编译器在编译主程序时把其他文件的内容包括进来的机制。例如用这个指令来包括iostream头文件。
实例:头文件应用
1 Rational.h文件
2
3 //Ration.h
4 //Create by 亦我飞也
5
6 //这个头文件用来声明有理数类(Rational class)
7 //类里面对四则运算进行重载,以实现分数运算
8
9 #include <iostream>
10
11 class Rational//定义基类
12 {
13 public:
14 Rational(int num,int denom); //构造器 num = 分子,denom = 分母
15
16 Rational operator+(Rational rhs);// rhs == right hand side(右手边参数)
17 Rational operator-(Rational rhs);
18 Rational operator*(Rational rhs);
19 Rational operator/(Rational rhs);
20
21 private:
22 void normalize();//负责对分数的简化处理
23
24 int numerator; //分子
25 int denominator; //分母
26
27 friend std::ostream& operator<<(std::ostream& os,Rational f);//传递给它的是哪一个流,它返回的就是那个流的一个引用
28 };
29 Rational.cpp文件
30
31 #include <iostream>
32 #include <string>
33 #include <math.h>
34 #include "Rational.h"//系统级别用单尖括号,自定义级别用双引号
35
36 using namespace std;
37 //class Rational//定义基类
38 //{
39 //public:
40 // Rational(int num,int denom); //构造器 num = 分子,denom = 分母
41 //
42 // Rational operator+(Rational rhs);// rhs == right hand side(右手边参数)
43 // Rational operator-(Rational rhs);
44 // Rational operator*(Rational rhs);
45 // Rational operator/(Rational rhs);
46 //
47 //private:
48 // void normalize();//负责对分数的简化处理
49 //
50 // int numerator; //分子
51 // int denominator; //分母
52 //
53 // friend ostream& operator<<(ostream& os,Rational f);//传递给它的是哪一个流,它返回的就是那个流的一个引用
54 //};
55
56 Rational::Rational(int num,int denom)//构造函数实现
57 {
58 numerator = num;
59 denominator = denom;
60
61 normalize();
62 }
63 //normalize()对分数进行简化操作包括:
64 //1.只允许分子为负数,如果分母为负数则把负数挪到分子部分,如1/-2==-1/2
65 //2.利用欧几里德算法(辗转求余原理)将分数进行简化:2/10 => 1/5
66
67 void Rational::normalize()
68 {
69 //确保分母为正
70 if( denominator < 0)
71 {
72 numerator = -numerator;
73 denominator = -denominator;
74 }
75 //欧几里德算法
76 int a = abs(numerator);
77 int b = abs(denominator);
78
79 //求出最大公约数
80 while(b>0)
81 {
82 int t = a % b;//取余
83 a = b;
84 b = t;
85 }
86
87 //分子、分母分别除以最大公约数得到最简化分数
88 numerator /= a;
89 denominator /= a;
90 }
91 //a c a*d c*b a*d + c*d
92 //- + - = --- + --- = ----------
93 //b d b*d b*d b*d
94 Rational Rational::operator+(Rational rhs)//分数的加运算
95 {
96 int a = numerator;
97 int b = denominator;
98 int c = rhs.numerator;
99 int d = rhs.denominator;
100
101 int e = a*b + c*d;
102 int f = b*d;
103
104 return Rational(e,f);
105 }
106 //a c a -c
107 //- - - = - + --
108 //b d b d
109 Rational Rational::operator-(Rational rhs)//分数的减运算
110 {
111 rhs.numerator = -rhs.numerator; //被减数分子取负数
112 return operator+(rhs);
113 }
114 //a c a*c
115 //- * - = ---
116 //b d b*d
117 Rational Rational::operator*(Rational rhs)//分数的乘运算
118 {
119 int a = numerator;
120 int b = denominator;
121 int c = rhs.numerator;
122 int d = rhs.denominator;
123
124 int e = a*c;
125 int f = b*d;
126
127 return Rational(e,f);
128 }
129 //a c a d
130 //- / - = - * -
131 //b d b c
132 Rational Rational::operator/(Rational rhs)//分数的除运算
133 {
134 //rhs的分子分母互换
135 int t = rhs.numerator;
136 rhs.numerator = rhs.denominator;
137 rhs.denominator = t;
138
139 return operator*(rhs);
140 }
141
142 ostream& operator<<(ostream& os,Rational f);//函数声明
143
144 int main()
145 {
146 Rational f1(2,16);//定义f1对象,且传入(2,16)参数
147 Rational f2(7,8);
148
149 //测试有理数加法运算
150 cout << f1 << " + " << f2 << " == " << (f1+f2) << "\n"; // 左移操作符<<已经被重载了
151
152 //测试有理数减法运算
153 cout << f1 << " - " << f2 << " == " << (f1-f2) << "\n"; //<< f1中由于f1属于Rational类型,将自动转到打印分数形式输出
154
155 //测试有理数乘法运算
156 cout << f1 << " * " << f2 << " == " << (f1*f2) << "\n";//<< "+"中由于<<后面参数是字符串,所以使用系统默认的打印
157
158 //测试有理数除法运算
159 cout << f1 << " / " << f2 << " == " << (f1/f2) << "\n";
160
161 return 0;
162 }
163 ostream& operator<<(ostream& os,Rational f)//并不属于Rational类,是一个独立的函数
164 {
165 if(f.numerator % f.denominator == 0)
166 os << f.numerator / f.denominator;
167 else
168 os << f.numerator << "/" << f.denominator;//打印分数
169 return os;
170 }