C++ 类和对象(例子)

sheganhuo 贡献于2012-02-22

作者 typ  创建于2004-04-21 08:07:00   修改者USER  修改于2011-01-08 01:42:00字数8476

文档摘要:定义并测试长方形类CRect,长方形是由左上角坐标(left,top)和右下角坐标(right,bottom)组成。
关键词:

定义并测试长方形类CRect,长方形是由左上角坐标(left, top)和右下角坐标(right, bottom)组成。 #include #include class CRect //定义长方形类 { private: int left, top, right, bottom ; public: void setcoord(int, int, int, int); void getcoord(int *L, int *T, int *R, int *B) //注意:形参为指针变量 { *L = left; *T = top; *R = right; *B = bottom; } void print(void) { cout<<"Area = "; cout< class Date { int Year, Month, Day; public: Date(int y=2003, int m=1, int d=1) //带参数缺省值的构造函数 { Year=y; Month=m; Day=d; } void ShowDate( ) { cout < #include class Student { char Num[10]; //学号,注意:用数组实现 char *Name; //姓名,注意:用指针实现 int Score; //成绩 public: Student(char *nump, char *namep, int score) { if(nump) //在构造函数中, { //不需要动态申请Num成员的空间 strcpy(Num, nump); } else strcpy(Num, ""); if(namep) //在构造函数中, { //需动态申请Name成员的空间 Name=new char[strlen(namep)+1]; strcpy(Name, namep); } else Name=0; Score=score; cout<<"Constructor Called!\n"; } ~Student( ) //在析构函数中, { //需释放Name成员的空间 if(Name) delete [ ] Name; cout<<"Desturctor Called!\n"; } void Show( ) { cout << Num << endl; cout << Name << endl; cout << Score << endl; } }; void main( ) { Student a("040120518", "George", 80); a.Show( ); } 此程序运行结果是: Constructor Called! //调用构造函数时的输出 040120518 George 80 Desturctor Called! //调用析构函数时的输出 返回ppt讲稿 例10.7 调用构造函数和析构函数的时机 #include class Date { int Year, Month, Day; public: Date(int y=2002, int m=1, int d=1) { Year=y; Month=m; Day=d; cout<<"Constructor: "; ShowDate( ); } void ShowDate( ) { cout < #include "point.h" void main( ) { Point p1(6, 8), p2(4, 7); Point p3(p1); // A调用拷贝构造函数 Point p4=p2; // B调用拷贝构造函数 p1.Show( ); p3.Show( ); p2.Show( ); p4.Show( ); } 此程序运行结果是: 6, 8 Copy-initialization Constructor Called. 4, 7 Copy-initialization Constructor Called. Point: 6, 8 Point: 6, 8 Point: 4, 7 Point: 4, 7 4, 7 Destructor Called. // 撤销 P4 6, 8 Destructor Called. // 撤销 P3 4, 7 Destructor Called. // 撤销 P2 6, 8 Destructor Called. // 撤销 P1 析构函数与构造函数的调用顺序相反 不定义拷贝构造函数时,运行出错。 //文件 Li1010.cpp #include #include class Student { char *Name; //姓名,注意:用指针实现 int Age; //年龄 public: Student(char *namep, int age) //构造函数 { Age=age; if(namep) //在构造函数中,需动态申请空间 { Name=new char[strlen(namep)+1]; strcpy(Name, namep); } else Name=NULL; } ~Student( )//因在构造函数中动态申请了空间, { //则在析构函数中,需释放空间 if(Name) delete [ ] Name; } void Show( ) { cout << Name << ',' << Age << endl; } }; void main( ) { Student a("George", 20); Student b=a; // A } 此程序运行时出错,原因是: 没有定义类的拷贝构造函数。系统自动产生的拷贝构造函数如下: Student::Student(const Student &s) { Name = s.Name; // 注意:地址值直接赋值 Age = s.Age; } Name: 1000 Age: 20 a 'G' 'e' 'o' 'r' 'g' 'e' '\0' Name: 1000 Age: 20 b 正确的做法是,定义如下拷贝构造函数: Student::Student(const Student &s) { Age=s.Age; if(s.Name) { Name = new char[strlen(s.Name)+1]; //C strcpy(Name, s.Name); } else Name=NULL; } Name: 1000 Age: 20 a 'G' 'e' 'o' 'r' 'g' 'e' '\0' Name: 2000 Age: 20 b 'G' 'e' 'o' 'r' 'g' 'e' '\0' 例10.11 在本例中,使用例10.9中“平面坐标点”类的头文件point.h,测试用对象做函数参数及函数返回值时拷贝构造函数的使用。 #include "point.h" //普通函数,不是类的成员函数 Point move(Point p, int xoffset, int yoffset) { int x = p.Getx( )+xoffset, y = p.Gety( )+yoffset; Point p=p1 //参数传递时 Point 内存临时对象=t。//返回对象时 Point t(x, y); return t; } void main( ) { Point p1(6, 8), p2; p2=move(p1, 2, 4); } 此程序运行结果是: 6, 8 Copy-initialization Constructor Called. //A 8, 12 Copy-initialization Constructor Called. // B 8, 12 Destructor Called. // 撤消对象t 6, 8 Destructor Called. // 撤消对象p 8, 12 Destructor Called. // 撤消内存临时对象 8, 12 Destructor Called. // 撤消对象p2 6, 8 Destructor Called. // 撤消对象p1 例10.13 利用构造函数完成类型转换 //文件 Li1013.cpp #include class Complex { double Real, Image; public: Complex(double x=0, double y=0) { Real=x; Image=y; Show( ); cout << "调用了构造函数\n"; } ~Complex( ) { Show( ); cout << "调用了析构函数\n"; } void Show( ) { cout<<'('< class ListClass { int *ListPtr; // 指向线性表的指针 int nMax; // 线性表的最大长度 int nElem; // 线性表中当前元素的个数 public: //构造函数,初始化线性表,最大长度的缺省值为10 ListClass(int n=10) { nElem=0; nMax=n; if(n) ListPtr = new int[n]; else ListPtr=0; } ~ListClass(void) //析构函数 { delete [nMax] ListPtr; } int Elem(int); //重载函数①,在线性表尾增加 //一个元素,在类体外实现 int &Elem(unsigned n) //重载函数② //返回线性表中第n个元素的引用 { return ListPtr[n]; } int Elem(void) //重载函数③ //返回线性表中当前元素的个数 { return nElem; } int Max(void) //返回线性表的长度 { return nMax; } int GetElem(int i) { if((i>=0) && (i #include class Point //定义“点”类 { int x, y; public: Point(int a=0, int b=0) { x=a; y=b; cout<
下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创文档 来获得金币奖励!

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档