命名空间其实就是由用户定义的范围,同一个命名空间里的东西只要在这个命名空间里具有独一无二的名字就行了。
例如:
1 namespace author
2
3 {
4
5 std::string person;
6
7 }
8
9 namespace programmer
10
11 {
12
13 std::string person;
14
15 }
两者由于在不同的命名空间,所以并不会出现冲突。
用一个using指令可以把特定命名从命名空间提取到全局作用域:
1 using std::cout;
2
3 cout << "Hello World!!\n";
using指令的出现决定着从命名空间里提取出来的东西能在哪个作用域内使用。如果把它放在某个函数声明的前面,他将拥有全局性;如果把他放在某个函数里,他将只在这一个函数里可以使用。
实例:
1 Rational.h文件:
2
3 //Ration.h
4 //Create by 亦我飞也
5
6 //这个头文件用来声明有理数类(Rational class)
7 //类里面对四则运算进行重载,以实现分数运算
8
9 //如果RATIONAL_H未被定义,则定义rational.h,执行定义类程序
10 //如果RATIONAL_H已经被定义,程序则直接跳到endif(即定义类程序只会执行一次)
11 #ifndef RATIONAL_H//如果没有定义rational.h
12
13 #define RATIONAL_H//定义rational.h
14
15 #include <iostream>
16
17 namespace myMath
18 {
19 class Rational//定义基类
20 {
21 public:
22 Rational(int num,int denom); //构造器 num = 分子,denom = 分母
23
24 Rational operator+(Rational rhs);// rhs == right hand side(右手边参数)
25 Rational operator-(Rational rhs);
26 Rational operator*(Rational rhs);
27 Rational operator/(Rational rhs);
28
29 private:
30 void normalize();//负责对分数的简化处理
31
32 int numerator; //分子
33 int denominator; //分母
34
35 friend std::ostream& operator<<(std::ostream& os,Rational f);//传递给它的是哪一个流,它返回的就是那个流的一个引用
36 };
37
38 void call_love_fishc();//输出爱心
39 }
40
41
42 #endif//如果已经定义rational.h,则结束
43
44
45 Rational.cpp文件
46
47 #include <iostream>
48 #include <string>
49 #include <math.h>
50 #include "Rational.h"//系统级别用单尖括号,自定义级别用双引号
51
52 using namespace std;
53 namespace myMath
54 {
55 Rational::Rational(int num,int denom)//构造函数实现
56 {
57 numerator = num;
58 denominator = denom;
59
60 normalize();
61 }
62 //normalize()对分数进行简化操作包括:
63 //1.只允许分子为负数,如果分母为负数则把负数挪到分子部分,如1/-2==-1/2
64 //2.利用欧几里德算法(辗转求余原理)将分数进行简化:2/10 => 1/5
65
66 void Rational::normalize()
67 {
68 //确保分母为正
69 if( denominator < 0)
70 {
71 numerator = -numerator;
72 denominator = -denominator;
73 }
74 //欧几里德算法
75 int a = abs(numerator);
76 int b = abs(denominator);
77
78 //求出最大公约数
79 while(b>0)
80 {
81 int t = a % b;//取余
82 a = b;
83 b = t;
84 }
85
86 //分子、分母分别除以最大公约数得到最简化分数
87 numerator /= a;
88 denominator /= a;
89 }
90 //a c a*d c*b a*d + c*d
91 //- + - = --- + --- = ----------
92 //b d b*d b*d b*d
93 Rational Rational::operator+(Rational rhs)//分数的加运算
94 {
95 int a = numerator;
96 int b = denominator;
97 int c = rhs.numerator;
98 int d = rhs.denominator;
99
100 int e = a*b + c*d;
101 int f = b*d;
102
103 return Rational(e,f);
104 }
105 //a c a -c
106 //- - - = - + --
107 //b d b d
108 Rational Rational::operator-(Rational rhs)//分数的减运算
109 {
110 rhs.numerator = -rhs.numerator; //被减数分子取负数
111 return operator+(rhs);
112 }
113 //a c a*c
114 //- * - = ---
115 //b d b*d
116 Rational Rational::operator*(Rational rhs)//分数的乘运算
117 {
118 int a = numerator;
119 int b = denominator;
120 int c = rhs.numerator;
121 int d = rhs.denominator;
122
123 int e = a*c;
124 int f = b*d;
125
126 return Rational(e,f);
127 }
128 //a c a d
129 //- / - = - * -
130 //b d b c
131 Rational Rational::operator/(Rational rhs)//分数的除运算
132 {
133 //rhs的分子分母互换
134 int t = rhs.numerator;
135 rhs.numerator = rhs.denominator;
136 rhs.denominator = t;
137
138 return operator*(rhs);
139 }
140
141 ostream& operator<<(ostream& os,Rational f)//并不属于Rational类,是一个独立的函数
142 {
143 if(f.numerator % f.denominator == 0)
144 os << f.numerator / f.denominator;
145 else
146 os << f.numerator << "/" << f.denominator;//打印分数
147 return os;
148 }
149
150 void call_love_fishc()//输出爱心
151 {
152 int i,j;
153 int n = 10;
154
155 for(i=1-(n>>1);i<=n;i++)//>>右移,右移一位除以2,左移一位乘以2
156 {
157 cout << "Hello World!";
158 if(i>=0)
159 {
160 for(j=0;j<i;j++)
161 cout << " ";
162 for(j=1;j<=2*(n-i)+1;j++)
163 cout << " *";
164 cout << endl;
165 }
166 else
167 {
168 for(j=i;j<0;j++)
169 cout << " ";
170 for(j=1;j<=n+2*i+1;j++)
171 cout << " *";
172 for(j=1;j<=-1-2*i;j++)
173 cout << " ";
174 for(j=1;j<=n+2*i+1;j++)
175 cout << " *";
176 cout << endl;
177 }
178 }
179
180 }
181
182
183 }
184
185
186 main.cpp文件:
187
188 #include <iostream>
189 #include "Rational.h"//系统级别用单尖括号,自定义级别用双引号
190 #include <string>
191 #include <math.h>
192 //using指令的出现决定着从命名空间里提取出来的东西能在哪个作用域内使用。
193 //如果把它放在某个函数声明的前面,他将拥有全局性;如果把他放在某个函数里,他将只在这一个函数里可以使用。
194 using namespace std;
195 using namespace myMath;//声明命名空间myMath
196
197 int main()
198 {
199 call_love_fishc();//输出爱心
200
201 Rational f1(2,16);//定义f1对象,且传入(2,16)参数
202 Rational f2(7,8);//或者使用myMath::Rational f2(7,8);
203
204 //测试有理数加法运算
205 cout << f1 << " + " << f2 << " == " << (f1+f2) << "\n"; // 左移操作符<<已经被重载了
206
207 //测试有理数减法运算
208 cout << f1 << " - " << f2 << " == " << (f1-f2) << "\n"; //<< f1中由于f1属于Rational类型,将自动转到打印分数形式输出
209
210 //测试有理数乘法运算
211 cout << f1 << " * " << f2 << " == " << (f1*f2) << "\n";//<< "+"中由于<<后面参数是字符串,所以使用系统默认的打印
212
213 //测试有理数除法运算
214 cout << f1 << " / " << f2 << " == " << (f1/f2) << "\n";
215
216 return 0;
217 }