程序设计与算法语言-类B
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第8章类与类对象
1
Ø复制/拷贝构造函数
一种特殊的成员函数
功能:用一个已知对象来初始化一个被创建的同类的对象用已定义对象来初始化正在创建的另一同类的对象Ø一般格式:
<类名>([const]<类名> &<引用名>)
必须是引用
3
Ø两类复制构造函数
ü浅复制/浅拷贝
简单的赋值复制
ü深复制/深拷贝
必须定义复制构造函数。复制需要新申请空间的情
况。
4
使用复制构造函数复制对象浅拷贝#include
class TPoint
{int x, y, z;
public:
TPoint(int x1, int x2, int x3)
{x=x1; y=x2; z=x3;
cout<<"构造函数被调用\n";
}
TPoint(TPoint&p);
~TPoint()
{ cout<<"析构函数被调用\n";
}
void disp()
{ cout<<"x="< ",y="< };TPoint::TPoint(TPoint&p) {x = p.x; y = p.y; z = p.z; cout<<"复制构造函数被调用\n"; } void main() {TPoint t1(1, 3, 5); TPoint t2(t1); t1.disp(); t2.disp(); } 5 6使用复制构造函数复制对象深拷贝 class String {char *s; //指向字符串的指针public:String(char *p=0)//构造函数{ if(p==0) s=0;else{s=new char[strlen(p)+1];strcpy(s,p); } cout<<”调用了构造函数\n ”;} String(const String &); //复制构造函数 ~String();//析构函数 void Show() { cout< };String::String(String &s1){if(s1.s){s=new char[strlen(s1.s)+1];strcpy(s,s1.s);}else s=0;cout<<”调用复制构造函数\n ”;} String::~String() {if(s) delete[ ]s;cout<<”调用析构函数\n ”; } void main(void) {String s1("C++ programming"), s2(s1); s1.Show(); s2.Show(); } 程序运行结果为: 调用了构造函数 调用复制构造函数 C++ programming C++ programming 调用析构函数 调用了析构函数 7 复制构造函数 10注意 u 类定义中,若未显式给出构造函数,并不是不用构造函数,而是由系统自动调用缺省构造函数或缺省拷贝构造函数。 u 若有程序设计者定义的构造函数(包括拷贝构造函数),则按函数重载的规律,调用合适的构造函数。 u 拷贝构造函数并不只在同类的一个对象去初始化该类另一对象时使用,它还在另二方面使用: 1.当函数形参是类的对象,调用函数时,进行形参与实参结合时使用。这时要在内存新建一个局部对象,并把实参拷贝到新对象中。理所当然也调用拷贝构造函数。 2.当函数的返回值是类对象,函数执行完成返回调用者时使构造函数 对象成员和类的嵌套定义 Ø对象成员 定义新类时,可把一已定义类的对象作为该类的成员。 产生新定义类的对象时,须对它的对象成员进行初始 化,且只能通过新类的构造函数来对它所有成员数据初 始化。 对对象成员进行初始化,必须通过调用其对象成员的构 造函数来实现。 11 在一个类的定义中,说明对象成员的一般格式为:class ClassName{ ClassName1 c1;ClassName2 c2; …… ClassNamen c n; public: ClassName(args); };class A { int x,y; public: A(int a,int b) { x=a;y=b;} }; class B { int z; A t; public: B(int a,int b,int c):t(a,b) { z=c;} }; 12 对类的对象成员初始化 class Point //定义点类 {float x,y; public: Point(float a,float b) { x=a;y=b; cout<<“调用了Point类构造 函数\n"; } ~Point() { cout<<“调用了Point类析构 函数\n";} void Show() { cout<<"x="< "y="< } };class Circle//定义圆类 { float r; public: Circle(float a) { r=a; cout<<"调用了Circle 类构造函数\n"; } ~Circle() { cout<<"调用了Circle 类析构函数\n";} void Show() { cout<<"r="< 13