C++专题(一)

1.定义Person类,源程序文件名为penson.h

 1 #include <iostream>
 2 #include <string>
 3 
 4 class Person
 5 {
 6 private:
 7     char Name[20];
 8     char Sex;
 9     int Age;
10 
11 public:
12     void SetData (char na[], char s, int a)
13     {
14         strcpy(Name, na);
15         Sex = s;
16         Age = a;
17     }
18     
19     void GetName (char *na)
20     {
21         strcpy(na, Name);
22     }
23 
24     char GetSex ()
25     {
26         return Sex;
27     }
28 
29     int GetAge ()
30     {
31         return Age;
32     }
33 };
View Code

  定义对象的形式是: <类名> <对象列表>;如 Person a,b;

2.定义Person类,在类外定义成员函数,程序文件名为person.h.

 1 #include <iostream>
 2 #include <string>
 3 
 4 class Person
 5 {
 6 private:
 7     char Name[20];
 8     char Sex;
 9     int Age;
10 
11 public:
12     void SetData (char [], char , int );
13     void GetName (char *);
14     char GetSex ();
15     int GetAge ();
16 };
17 
18 void Person::SetData (char na[], char s, int a)
19 {
20     strcpy(Name, na);
21     Sex = s;
22     Age = a;
23 }
24 
25 void Person::GetName (char *na)
26 {
27     strcpy(na, Name);
28 }
29 
30 char Person::GetSex ()
31 {
32     return Sex;
33 }
34 
35 int Person::GetAge ()
36 {
37     return Age;
38 }
View Code

3.测试Person类.

 1 #include "Person.h"
 2 
 3 using namespace std;
 4 
 5 void main ()
 6 {
 7     Person a, *pa;
 8     char name[20];
 9 
10     a.SetData("Cheng", 'F', 20);
11     a.GetName(name);
12     cout << "Name: " << name << endl;
13     cout << "Sex " << a.GetSex() << endl;
14     cout << "Age: " << a.GetAge() << endl;
15     pa = &a;
16     pa->SetData("Zhang", 'M', 18);
17     pa->GetName(name);
18     cout << "Name: " << name << endl;
19     cout << "Sex: " << pa->GetSex() << endl;
20     cout << "Age: " << pa->GetAge() << endl;
21 }
View Code

结果:

Name: Cheng

Sex: F

Age: 20

Name: Zhang

Sex: M

Age: 18

4.定义并测试长方形类CRect,长方形右左上角坐标(left, top)和右下角坐标(right, bottom)组成.

 1 #include <iostream>
 2 #include <cmath>
 3 
 4 using namespace std;
 5 
 6 class CRect
 7 {
 8 private:
 9     int left, top, right, bottom;
10 
11 public:
12     void setcoord (int , int, int, int );
13     void getcoord (int *L, int *T, int *R, int *B)
14     {
15         *L = left;
16         *T = top;
17         *R = right;
18         *B = bottom;
19     }
20 
21     void print (void)
22     {
23         cout << "Area = " << abs(right - left) * abs(bottom - top) << endl;
24     }
25 };
26 
27 void CRect::setcoord (int L, int T, int R, int B)
28 {
29     left = L;
30     top = T;
31     right = R;
32     bottom = B;
33 }
34 
35 void main (void)
36 {
37     CRect r, rr;
38     int a, b, c, d;
39     r.setcoord(100, 300, 50, 200);
40     r.getcoord(&a, &b, &c, &d);
41     cout << "left=" << a << '	' << "top=" << b << endl;
42     cout << "right=" << c << '	' << "bottom=" << d << endl;
43     r.print();
44     rr = r;
45     rr.print();
46 }
View Code

结果:

left=100  top=300

right=50  bottom=200

Area=5000

Area=5000

5.自身类的对象不可以作为成员,而自身类的指针或引用可以作为类的成员.

 1 class Obj
 2 {
 3     int x;
 4     double y;
 5 };
 6 
 7 class Person
 8 {
 9     char Name[20];
10     char Sex;
11     int Age;
12     Obj obj1, obj2;                //可以
13     Person a, b;                //不可以
14     Person *pa;                //可以
15 };
View Code

6.当B类对象的指针或引用作为A类的成员时,如果B类的定义在A类之后,则在A类的定义之前,必须对B类做一个引用性说明.

 1 class B;
 2 
 3 class A
 4 {
 5 private:
 6     B *pb;
 7 
 8 public:
 9     ...
10 };
11 
12 class B
13 {
14     ...
15 };
View Code

7.结构体变量的成员赋始值可以在定义结构体变量的同时进行,而对于类,如果其成员是公有的,才能在定义对象时进行赋初值.

1 class CRect
2 {
3 public:
4     int left, top, right, bottom;
5 };
6 
7 CRect r = {100, 300, 50, 200};
View Code

8.定义日期类,利用构造函数初始化数据成员.程序放在头文件date.h中

头文件:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Date
 6 {
 7     int Year, Month, Day;
 8 
 9 public:
10     Date (int y = 2003, int m = 1, int d = 1)
11     {
12         Year = y;
13         Month = m;
14         Day = d;
15     }
16 
17     void ShowDate (void)
18     {
19         cout << Year << '.' << Month << '.' << Day << endl;
20     }
21 };
date.h

源文件:

 1 #include "date.h"
 2 
 3 void main (void)
 4 {
 5     Date d1, d2(2008), d3(2008, 10), d4(2008, 10, 6);
 6 
 7     d1.ShowDate();
 8     d2.ShowDate();
 9     d3.ShowDate();
10     d4.ShowDate();
11 }
View Code

结果:

2003.1.1

2008.1.1

2008.10.1

2008.10.6

Mark:

  构造函数的特点如下:

  1.构造函数是成员函数,函数体可写在类体内,也可写在类体外.

  2.构造函数是特殊函数,该函数的名字与类名相同,不指定返回值类型.

  3.构造函数可以重载,即可以定义多个参数个数不同的构造函数.

  4.在创建对象时,系统自动调用构造函数.

  在类体内定义构造函数的一般格式是: ClassName (<形参列表>) {...}

  在类体外定义构造函数的一般格式是: ClassName::ClassName (<形参列表>) {...}

9.定义学生类,利用构造函数初始化数据成员,利用析构函数做清理工作.

头文件:

 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 class Student
 7 {
 8     char Num[10], *Name;
 9     int Score;
10 
11 public:
12     Student (char *nump, char *namep, int score)
13     {
14         if (nump)
15             strcpy(Num, nump);                        //在构造函数中,不需要动态申请Num成员的空间
16         else
17             strcpy(Num, "");
18         if (namep)
19         {
20             Name = new char [strlen(namep)+1];        //在构造函数中,需要动态申请Name成员的空间
21             strcpy(Name, namep);
22         }
23         else
24             Name = NULL;
25         Score = score;
26         cout << "Constructor Called!
";
27     }
28 
29     ~Student (void)
30     {
31         if (Name)
32             delete [] Name;
33         cout << "Destructor Called!
";
34     }
35 
36     void Show (void)
37     {
38         cout << Num << '	' << Name << '	' << Score << endl;
39     }
40 };
student.h

源文件:

1 #include "student.h"
2 
3 void main (void)
4 {
5     Student a("040120518", "George", 80);
6     a.Show();
7 }
View Code

结果:

Constructor Called!

040120518  George  80

Destructor Called!

Mark:

  析构函数的特点如下:

  1.析构函数是成员函数,可在类体内定义,也可在类体外定义.

  2.一般地,将析构函数定义成共有成员函数.

  3.析构函数也是特殊函数,该函数的名字是类名前加~,用来与构造函数区分,该函数不指定返回值类型,没有参数.

  4.一个类只能定义一个析构函数,即析构函数不允许重载.

  5.析构函数可以被显示调用,也可以由系统自动调用.

原文地址:https://www.cnblogs.com/zero-jh/p/5034839.html