C/C++面向对象基本概念解析[二]
C/C++面向对象基本概念解析
面向对象(Object-Oriented,OO),是一种软件开发的方法学,分为面向对象的分析OOA(Object-Oriented Analysis)、面向对象的设计OOD(Object Oriented Design)、面向对象的建模OOM(Object Oriented Modeling)、面向对象的编程OOP(Object Oriented Programing)和面向对象的测试OOT(Object Oriented Test)等子过程。
程序描述:OOP 综合样板,清晰地演示说明了分类、继承、封装和多态的C++实现方法。
【源程序 2-2】
01 #include
02 using namespace std;
03
04 class Location
05 {
06 protected:
07 int x;
08 int y;
09 public:
10 Location(int InitX,int InitY);
11 int GetX();
12 int GetY();
13 void SetX(int InitX);
14 void SetY(int InitY);
15 virtual void Show() { };
16 virtual void Hide()=0;
17 };
18
19 enum Boolean{FALSE,TRUE};
20 enum PointType{FreePoint, Online, CircleCenter };
21 class Point : public Location
22 {
23 public:
24 PointType PType;
25 private:
26 Boolean Visible;
27 protected:
28 static int NumOfInstances;
29 public:
30 Point(int InitX=0,int InitY=0, PointType InitPType=FreePoint);
31 Point(Point& APoint);
32 ~Point();
33 virtual void Show();
34 void Show(int ColorID);
35 virtual void Hide();
36 void MoveTo(int NewX=0,int NewY=0);
37 static int getNumOfInstances()
38 {return NumOfInstances;}
39 Boolean GetVisible();
40 protected:
41 void SetVisible(Boolean NewVisible)
42 { Visible=NewVisible; }
43 private:
44 void AssignAPoint(Point& P);
45 };
46
47 class Circle : public Point
48 {
49 protected:
50 int Radius;
51 public:
52 Circle(int InitRadius=0,int InitX=0,int InitY=0);
53 Circle(Point& InitCenterPoint,int InitRadius=0);
54 Circle(Circle& ACircle);
55 ~Circle();
56 int GetRadius() { return Radius;}
57 virtual void Show();
58 virtual void Hide();
59 void Expand(int ExpandBy);
60 };
61
62 Location::Location(int InitX,int InitY)
63 {
64 x=InitX;
65 y=InitY;
66 }
67
68 int Location::GetX()
69 { return x; }
70
71 int Location::GetY()
72 { return y; }
73
74 void Location::SetX(int InitX)
75 { x=InitX;}
76 void Location::SetY(int InitY)
77 { y=InitY; }
78
79 int Point:: NumOfInstances=0;
80
81 Point::Point(int InitX,int InitY, PointType InitPType)
82 :Location(InitX, InitY)
83 {
84 NumOfInstances++;
85 PType=InitPType;
86 }
87
88 void Point:: AssignAPoint(Point& P)
89 {
90 NumOfInstances++;
91 PType= P.PType;
92 }
93 Point::Point(Point& APoint) :Location(APoint.x, APoint.GetY())
94 {
95 AssignAPoint(APoint);
96 }
97
98 Point::~Point()
99 {
100 NumOfInstances--;
101 cout<<"~Point ";
102 }
103 Boolean Point::GetVisible()
104 { return Visible; }
105 void Point::Show()
106 {
107 Visible=TRUE;
108 cout<<"ShowPoint:"
109 <<"("<<"x="<
110 <<"Visible="<
111 <<"PType=" << PType <<")n";
112 }
113
114 void Point::Show(int ColorID)
115 {
116 Visible=TRUE;
117 cout<<"ShowPoint:"
118 <<"("<<"x="<
119 <<"Visible="<
120 <<"PType=" << PType <<", "
121 <<"ColorID=" <
122 }
123
124 void Point::Hide()
125 {
126 Visible=FALSE;
127 cout<<"The point:("<
128 }
129 void Point::MoveTo(int NewX,int NewY)
130 {
131 if(Visible) Hide();
132 x=NewX;
133 y=NewY;
134 Show();
135 }
136
137 Circle::Circle(int InitRadius, int InitX,int InitY)
138 : Point(InitX,InitY, CircleCenter)
139 {
140 Radius=InitRadius;
141 }
142 Circle::Circle(Point& InitCenterPoint, int InitRadius)
143 : Point(InitCenterPoint)
144 {
145 Radius=InitRadius;
146 PType=CircleCenter;
147 }
148
149 Circle::Circle(Circle& ACircle)
150 :Point(ACircle.GetX(), ACircle.GetY(), ACircle.PType)
151 {
152 Radius=ACircle.GetRadius();
153 }
154
155 Circle::~Circle()
156 {
157 cout << "n~Circle ";
158 }
159 void Circle::Expand(int ExpandBy)
160 {
161 Radius+=ExpandBy;
162 if(Radius<0) Radius=0;
163 Show();
164 }
165 void Circle::Show()
166 {
167 SetVisible(TRUE);
168 cout<<"Show Circle:"
169 <<" Centre is ("
170 <
171 <<"Radius="<
172 }
173 void Circle::Hide()
174 {
175 SetVisible(FALSE);
176 cout<<"Hide the circle!!!"<<"n";
177 cout<<"The centre of the circle is:("
178 <
179 cout<<"The Radius of the circle is:"<
180 cout<<"the Circle is Hidden"<<"n";
181 }
182
183 void main()
184 {
185 cout<<"--Using Point Class--"<<"n";
186 cout<<"NumOfInstances="
187 <
188 Point P1(2,9, Online), P2(2,9), P3(2), P4;
189 Point P5(P1);
190 P1.Show();
191 P1.Show(4);
192 P2.Show();
193 P3.Show();
194 P4.Show();
195 P5.Show();
196
197 cout <<"n";
198 cout<< "Access P1's all Members:"<<"n";
199 cout<<"NumOfInstances="
200 <
201 <<"P1.x="<
202 << "P1.y="<
203 <<"P1.PType="<
204 <<"P1.Visible="<
205
206 {
207 //通过类实例数组演示局部变量及其析构
208 Point PArr[4];
209 cout<<"NumOfInstances="
210 <
211
212 Point* PtrArr=PArr;
213 for (int i=0; i<4; i++)
214 {
215 cout << "i=" <
216 PArr->SetX(i);
217 PArr->SetY(i+i);
218 PArr->Show();
219 PtrArr=PtrArr+1;
220 }
221 }
222 cout<<"NumOfInstances="
223 <
224
225 Point *PtrP1;
226 PtrP1=&P1;
227 cout<< "Access P1 using PtrP1:" <<"n";
228 PtrP1->Show();
229 cout<<"NumOfInstances="
230 <getNumOfInstances()<<"n"
231 <<"PtrP1->x="<GetX()<<", "
232 <<"PtrP1->y="<GetY()<<", "
233 <<"PtrP1->PType="<PType<<", "
234 <<"PtrP1->Visible="<GetVisible()<<"nn";
235
236 cout<<"--Using Circle Class--"<<"n";
237 cout<<"NumOfInstances="
238 <
239 Circle C1(99, 3, 8), C2(99, 3), C3(99), C4(1,1), C5(P1,88), C6(P1);
240 Circle C7(C1);
241
242 cout<<"After run Circle C6(C1), NumOfInstances="
243 <
244
245 C1.Show();
246 C2.Show();
247 C3.Show();
248 C4.Show();
249 C5.Show();
250 C6.Show();
251 C7.Show();
252
253 cout<< "nAccess C1's all members: ";
254 cout <<"C1.Radius="<
255 <<"C1.x="<
256 << "C1.y="<
257 <<"C1.PType="<
258 <<"C1.Visible="<
259
260 Circle* PtrC1;
261 PtrC1=&C1;
262 cout<< "Access C1 using PtrP1:" <<"n";
263 PtrC1->Show();
264 cout<<"NumOfInstances="
265 <getNumOfInstances()<<"n"
266 <<"PtrC1->Radius="<GetRadius()<<"n"
267 <<"PtrC1->x="<GetX()<<","
268 <<"PtrC1->y="<GetY()<<","
269 <<"PtrC1->PType="<PType<<", "
270 <<"PtrC1->Visible="<GetVisible()<<"n";
271
272 cout << "Call C1.Expand(20):n";
273 C1.Expand(20);
274 cout<<"n";
275
276 cout<<"Access C1 using Parent Class Pointer:PtrP1:" <<"n";
277 PtrP1=&C1;
278 PtrP1->Show(); //Calling Point.Show() or Circle.Show() ?
279 cout<<"NumOfInstances="
280 <getNumOfInstances()<<"n"
281 //<<"PtrP1->Radius="<GetRadius()<<"n"// Why?
282 <<"PtrP1->x="<GetX()<<","
283 <<"PtrP1->y="<GetY()<<","
284 <<"PtrP1->PType="<PType<<","
285 <<"PtrP1->Visible="<GetVisible()<<"n";
286
287 /*--Advanced OOP -- */
288 //P1.AssignAPoint(&P1); Why not be permitted?
289 // Location L1(2,9); Why not be permitted?
290 }
程序说明:
(1) 本程序第1~61 行完成了Location、Point 和Circle 这3 个类的定义;第62~181 行完成了这3 个类的实现,即对类中定义的成员函数给出实现代码和对特殊成员变量进行初始化(第79 行);第183~290 行对这3 个类演示了各种应用和操作,图2.2 给出了这些应用的输出结果。

图 2.2 OOP 综合样板程序的输出结果
(2) 该程序包括了OOP 的基本概念的定义、实现和应用技术,本章的后续内容将陆续予以分析和说明。