例5.1
分析下面程序中析构函数与构造函数的调用顺序。
1 #include<iostream> 2 3 using namespace std; 4 5 class object 6 { 7 private: 8 int val; 9 public: 10 object() :val(0) 11 { 12 cout << "Ddfault constructor for object" << endl; 13 } 14 object(int i) :val(i) 15 { 16 cout << "Constructor for object " << val << endl; 17 } 18 ~object() 19 { 20 cout << "Destructor for object" << val << endl; 21 } 22 }; 23 24 class container 25 { 26 private: 27 object one;//初始化顺序与对象成员产生的顺序有关 28 object two;//排在前面的先初始化 29 int data; 30 public: 31 container() :data(0) 32 { 33 cout << "Ddfault constructor for object" << endl; 34 } 35 container(int i, int j, int k); 36 ~container() 37 { 38 cout << "Destructor for object" << data << endl; 39 } 40 }; 41 42 container::container(int i, int j, int k) :two(i), one(j)//与初始化列表顺序无关 43 { 44 data = k; 45 cout << "Constructor for container " << data << endl; 46 } 47 48 void main() 49 { 50 container obj, anObj(5, 6, 10); 51 52 system("pause"); 53 }
例5.2
分析下面程序的输出结果。
1 class Test 2 { 3 static int x;//静态数据成员 4 int n; 5 public: 6 Test() 7 { 8 9 } 10 Test(int a, int b) 11 { 12 x = a; 13 n = b; 14 } 15 static int func() 16 { 17 return x;//静态成员函数 18 }; 19 static void sfunc(Test&r, int a) 20 { 21 r.n = a;//静态成员函数 22 } 23 int Getn() 24 { 25 return n;//非静态成员函数 26 } 27 }; 28 29 int Test::x = 25;//初始化静态数据成员 30 31 #include<iostream> 32 33 using namespace std; 34 35 void main() 36 { 37 cout << Test::func();//x在产生对象之前即存在,输出25 38 39 Test b, c; 40 b.sfunc(b, 58);//设置对象b的数据成员n 41 42 cout << " " << b.Getn(); 43 cout << " " << b.func();//x属于所有对象,输出25 44 cout << " " << c.func();//x属于所有对象,输出25 45 46 Test a(24, 56);//将类的x值改为24 47 48 cout << " " << a.func() << " " << b.func() << " " << b.func() << endl; 49 50 system("pause"); 51 }
5.3
使用静态对象的例子
1 #include<iostream> 2 3 using namespace std; 4 5 class test 6 { 7 private: 8 int n; 9 public: 10 test(int i) 11 { 12 n = i; 13 cout << "constructor:" << i << endl; 14 } 15 ~test() 16 { 17 cout << "destructor:" << n << endl; 18 } 19 int getn() 20 { 21 return n; 22 } 23 void inc() 24 { 25 ++n; 26 } 27 }; 28 29 void main() 30 { 31 cout << "loop start:" << endl; 32 33 for (int i = 0; i < 3; i++) 34 { 35 static test a(3); 36 test b(3); 37 a.inc(); 38 b.inc(); 39 cout << "a.n=" << a.getn() << endl; 40 cout << "b.n=" << b.getn() << endl; 41 } 42 43 cout << "loop end." << endl; 44 cout << "Exit main()" << endl; 45 46 system("pause"); 47 }
例5.4
使用友元函数计算两点距离的例子。
1 #include <iostream> 2 #include <cmath>//也可以使用头文件<math.h> 3 using namespace std; 4 class Point 5 { 6 private: 7 double X, Y; 8 public: 9 Point(double xi, double yi) 10 { 11 X = xi, Y = yi; 12 } 13 double GetX() 14 { 15 return X; 16 } 17 double GetY() 18 { 19 return Y; 20 } 21 friend double distances(Point&, Point&);//声明友元函数 22 }; 23 double distances(Point& a, Point& b)//像普通函数一样定义友元函数 24 { 25 double dx = a.X - b.X;//可以访问对象a的成员 26 double dy = a.Y - b.Y;//可以访问对象b的成员 27 return sqrt(dx*dx + dy*dy); 28 } 29 void main() 30 { 31 Point p1(3.5, 5.5), p2(4.5, 6.5); 32 cout << "The distance is " << distances(p1, p2) << endl; 33 34 system("pause"); 35 }
例5.5
类One的对象通过友元函数访问类Two的对象的私有数据。
1 #include <iostream> 2 using namespace std; 3 class Two;//先声明类Two以便类One引用Two& 4 class One 5 { 6 private: 7 int x; 8 public: 9 One(int a) 10 { 11 x = a; 12 } 13 int Getx() 14 { 15 return x; 16 } 17 void func(Two&);//声明本类的成员函数,参数为Two类的引用 18 }; 19 class Two 20 { 21 private: 22 int y; 23 public: 24 Two(int b) 25 { 26 y = b; 27 } 28 int Gety() 29 { 30 return y; 31 } 32 friend void One::func(Two&);//声明类One的函数为友元函数 33 }; 34 void One::func(Two& r)//定义类One的函数成员 35 { 36 r.y = x;//修改类Two的数据成员 37 } 38 void main() 39 { 40 One Obj1(5); 41 Two Obj2(8); 42 cout << Obj1.Getx() << " " << Obj2.Gety() << endl; 43 Obj1.func(Obj2); 44 cout << Obj1.Getx() << " " << Obj2.Gety() << endl; 45 46 system("pause"); 47 }
例5.6
类One的对象可以通过任意一个成员函数访问类Two的对象的私有数据。
1 #include <iostream> 2 3 using namespace std; 4 5 class Two 6 { 7 int y; 8 public: 9 friend class One; 10 }; 11 12 class One 13 { 14 int x; 15 public: 16 One(int a, Two&r, int b) 17 { 18 x = a; 19 r.y = b; 20 } 21 void Display(Two&); 22 }; 23 24 void One::Display(Two&r) 25 { 26 cout << x << " " << r.y << endl; 27 } 28 29 void main() 30 { 31 Two Obj2; 32 One Obj1(23, Obj2, 55); 33 Obj1.Display(Obj2); 34 35 system("pause"); 36 }
例5.7
常数据成员初始化和常引用作为函数参数。
1 #include <iostream> 2 3 using namespace std; 4 5 class Base 6 { 7 private: 8 int x; 9 const int a;//常数据成员只能通过初始化列表来获得初值 10 static const int b;//静态常数据成员 11 const int& r;//常引用只能通过初始化列表来获得初值 12 public: 13 Base(int, int); 14 void Show() 15 { 16 cout << x << "," << a << "," << b << "," << r << endl; 17 } 18 void Display(const double& r) 19 { 20 cout << r << endl; 21 } 22 }; 23 24 const int Base::b = 125;//静态常数据成员在类外初始化 25 26 Base::Base(int i, int j) :x(i), a(j), r(x)//初始化列表 27 { 28 29 } 30 31 void main() 32 { 33 Base a1(104, 118), a2(119, 140); 34 a1.Show(); 35 a2.Show(); 36 a2.Display(3.14159);//常引用作为函数参数 37 38 system("pause"); 39 }
例5.8
const对象调用const成员函数。
1 #include <iostream> 2 3 using namespace std; 4 5 class Base 6 { 7 private: 8 double x, y; 9 const double p; 10 public: 11 Base(double m, double n, double d) :p(d)//通过初始化列表来获得初值 12 { 13 x = m; 14 y = n; 15 } 16 void Show(); 17 void Show() const; 18 }; 19 20 void Base::Show() 21 { 22 cout << x << "," << y << " p=" << p << endl; 23 } 24 25 void Base::Show() const//定义时必须也使用const 26 { 27 cout << x << "," << y << " const p=" << p << endl; 28 } 29 30 void main() 31 { 32 Base a(8.9, 2.5, 3.1416); 33 const Base b(2.5, 8.9, 3.14); 34 b.Show();//调用void Show() const 35 a.Show();//调用void Show() 36 37 system("pause"); 38 }
例5.9
const函数返回的常量对象与其他常量对象一起使用。
1 #include <iostream> 2 3 using namespace std; 4 5 class ConstFun 6 { 7 public: 8 int f5() const 9 { 10 return 5;//返回常量对象 11 } 12 int Obj() 13 { 14 return 45; 15 } 16 }; 17 18 void main() 19 { 20 ConstFun s;//一般对象 21 const int i = s.f5();//对象s使用f5()初始化常整数 22 const int j = s.Obj();//对象s使用Obj()初始化常整数 23 int x = s.Obj();//对象s使用Obj()作为整数 24 int y = s.f5();//对象s使用f5()作为整数 25 26 cout << i << " " << j << " "//输出5和45 27 << x << " " << y;//输出45和5 28 29 const ConstFun d;//const对象 30 int k = d.f5();//常量对象d只能调用常成员函数 31 32 cout << " k=" << k << endl;//输出5 33 34 system("pause"); 35 }
例5.10
使用类对象数组和指针的例子。
1 class Test 2 { 3 int num; 4 double f1; 5 public: 6 Test(int n)//一个参数的构造函数 7 { 8 num = n; 9 } 10 Test(int n, double f)//两个参数的构造函数 11 { 12 num = n; 13 f1 = f; 14 } 15 int GetNum() 16 { 17 return num; 18 } 19 double GetF() 20 { 21 return f1; 22 } 23 }; 24 25 #include <iostream> 26 27 using namespace std; 28 29 void main() 30 { 31 Test one[2] = { 2,4 }, *p; 32 Test two[2] = { Test(1,3.2),Test(5,9.5) }; 33 34 for (int i = 0; i < 2; i++)//输出对象数组对象 35 { 36 cout << "one[" << i << "]=" << one[i].GetNum() << endl; 37 } 38 39 p = two;//使用指针输出对象数组元素 40 41 for (int i = 0; i < 2; i++, p++) 42 { 43 cout << "tow[" << i << "]=(" << p->GetNum() << "," 44 << p->GetF() << ")" << endl; 45 } 46 47 system("pause"); 48 }
例5.11
仍然使用类Test,但改用对象指针数组的演示主程序。
1 class Test 2 { 3 int num; 4 double f1; 5 public: 6 Test(int n)//一个参数的构造函数 7 { 8 num = n; 9 } 10 Test(int n, double f)//两个参数的构造函数 11 { 12 num = n; 13 f1 = f; 14 } 15 int GetNum() 16 { 17 return num; 18 } 19 double GetF() 20 { 21 return f1; 22 } 23 }; 24 25 #include <iostream> 26 27 using namespace std; 28 29 void main() 30 { 31 Test *one[2] = { new Test(2),new Test(4) }; 32 Test *two[2] = { new Test(1,3.2),new Test(5,9.5) }; 33 34 for (int i = 0; i < 2; i++)//输出对象数组对象 35 { 36 cout << "one[" << i << "]=" << one[i]->GetNum() << endl; 37 } 38 39 for (int i = 0; i < 2; i++) 40 { 41 cout << "tow[" << i << "]=(" << two[i]->GetNum() << "," 42 << two[i]->GetF() << ")" << endl; 43 } 44 45 system("pause"); 46 }
求解一元二次方程
头文件
equation.h
源文件
equation.cpp
源文件
Find.cpp
头文件
equation.h
1 #if ! defined(EQUATION_H) 2 #define EQUATION_H 3 #include<iostream> 4 #include<cmath> 5 using namespace std; 6 //*************************** 7 //* 先声明FindRoot类 * 8 //*************************** 9 class FindRoot 10 { 11 private: 12 float a, b, c, d; 13 double x1, x2; 14 public: 15 FindRoot(float x, float y, float z); 16 void Find(); 17 void Display(); 18 }; 19 #endif
源文件
equation.cpp
1 #include"equation.h" 2 //*************************** 3 //* 实现FindRoot类 * 4 //*************************** 5 FindRoot::FindRoot(float x, float y, float z)//构造函数 6 { 7 a = x; 8 b = y; 9 c = z; 10 d = b*b - 4 * a*c; 11 } 12 13 void FindRoot::Find()//实现成员函数Find 14 { 15 if (d > 0) 16 { 17 x1 = (-b + sqrt(d)) / (2 * a); 18 x2 = (-b - sqrt(d)) / (2 * a); 19 return; 20 } 21 else if (d == 0) 22 { 23 x1 = x2 = (-b) / (2 * a); 24 return; 25 } 26 else 27 { 28 x1 = (-b) / (2 * a); 29 x2 = sqrt(-d) / (2 * a); 30 } 31 } 32 33 void FindRoot::Display()//实现成员函数Display 34 { 35 if (d > 0) 36 { 37 cout << "X1=" << x1 << " X2" << x2 << endl; 38 return; 39 } 40 else if (d == 0) 41 { 42 cout << "X1=X2=" << x1 << endl; 43 return; 44 } 45 else 46 { 47 cout << "X1=" << x1 << "+" << x2 << "i" << endl; 48 cout << "X2=" << x1 << "-" << x2 << "i" << endl; 49 } 50 }
源文件
Find.cpp
1 #include"equation.h" 2 3 void Read(float&, float&, float&);//参数使用对象引用方式 4 5 void main() 6 { 7 float a, b, c; 8 9 cout << "这是一个求方程ax2+bx+c=0的根的程序。" << endl; 10 11 for (;;)//循环求解 12 { 13 Read(a, b, c);//准备系数 14 15 if (a == 0)//根据输入系数a决定是否结束for循环 16 { 17 return; 18 } 19 20 FindRoot obj(a, b, c);//建立对象obj 21 22 obj.Find();//求解 23 obj.Display();//输出计算结果 24 }//endfor 25 } 26 27 void Read(float& a, float& b, float& c)//准备系数 28 { 29 cout << "输入方程系数a:"; 30 31 cin >> a; 32 33 if (a == 0)//系数a为零,则退出Read函数 34 { 35 getchar();//为了消除回车的影响 36 return;//将a=0返给for循环并退出Read函数 37 } 38 39 cout << "输入方程系数b:"; 40 cin >> b; 41 42 cout << "输入方程系数c:"; 43 cin >> c; 44 }