?教学目的与要求:
了解对象的初始化及深拷贝和浅拷贝 。
掌握拷贝构造函数的定义和使用及含有对象成员类的定义和使用 。
教学内容提要:
1,拷贝构造函数;
2,对象成员;
教学重点:拷贝构造函数的定义和使用 。
教学难点:含有对象成员类的定义和使用 。
教学进度,P71~P73,P97~P99
教学过程:
第 9 讲 拷贝构造函数及对象成员
1.为什么要引入拷贝构造函数?
2.拷贝构造函数定义
int x=10;
int y=x;
student zh(“zhang”,’m’,20);
student li=zh;
当用一个对象去初始化同类的另一个对象时需要调用拷贝构造函数,为创建的对象申请所需的内存空间,
并已知对象的数据成员去初始化该对象的数据成员。
【 9.1 拷贝构造函数 】
拷贝构造函数:函数名与类名相同,没有返回类型,
且只能有一个对该类对象的引用的参数的成员函数。
格式,<类名 >::< 拷贝构造函数名 >( <类名 > &<引用名 >)
{ 函数体 }
例,student,,student(student & p)
{
strcpy(name,p.name);
sex=p.sex;
age=p.age;
}
3,拷贝构造函数的调用时刻:
一个对象去初始化另一个对象时,系统会自动调用拷贝构造函数。
概括起来有三种场合:
1)、声明并初始化对象变量时;
2)、对象作为函数参数时;
3)、对象作为函数返回值时;
#include <iostream.h>
class Tpiont
{
public:
Tpiont(int ix,int iy)
{
x=ix ; y=iy;
cout<<”constructor called\n”;
}
Tpiont(Tpiont & p);
~Tpiont()
{ cout<<,Destructorcalled\n”; }
int xcord() {return x; }
int ycord() {return y; }
private,int x,y;
};
Tpiont::Tpiont(Tpiont
& p)
{ x=p.x; y=p.y;
cout<<”copy
constrctor called\n”;
}
void fun1(Tpiont q)
{ cout<<”In functiont
fun1()\n”;
}
Tpiont fun2()
{ Tpiont T(10,20);
return T;
}
例 9.1
void main()
{
Tpiont p1(4,9),p2(0,0);
Tpiont p3(p1);
cout<<”p3=(”<<p3.xcord()<<’,’<<p3.ycord()<<”)\n”;
fun1(p3);
p2=fun2();
}
4.默认的拷贝构造函数:
当类定义体中没有定义拷贝构造函数,C++系统会自动提供一个默认的拷贝构造函数。
功能:
只能完成存储空间的分配以及实现一个数据成员到一个数据成员的复制。
5.浅拷贝和深拷贝数:
浅拷贝:创建P2对象时,对象P1被复制给P2,但资源并没有复制,因此P1和P2 指向同一个资源。
class person
{ p1.pname
public:
person(char *pn)
{ pname=new char[strlen(pn)+1];
if(pname!=0)
{ strcpy(pname,pn);} p2.pname
}
~person() { delete []pname; }
private,char *pname;
};
void main()
{ person p1(“randy”);
person p2=p1;
}
例 9.2
深拷贝:创建P2对象时,对象P1被复制给P2,
同时其资源也作了复制,因此P1和P2 指向不同的资源。
在上例的基础上添加一个拷贝构造函数:
person::person(person & p) p1.pname
{
pname=new char[strlen(p.pname)+1];
if(pname!=0) p2.pname
{ strcpy(pname,p.pnamne); }
}
1、什么是对象成员对象成员,在类定义体中使用另一类的对象作为本类的数据成员。
class TDate
{
//…
};
class student
{ public:
//…
private,
char*name;
char sex;
TDate birthday; //birthday为对象成员,
//它是 TDate的 对象
};
【 9.2 对象成员 】
1) 对于带对象成员的类的对象创建时,应先调用对象成员所属类的构造函数,然后是本类中的构造函数。
2)对于带对象成员的类的对象撤消时,应先调用本类中的析构函数,然后是对象成员所属类的析构函数。
3) 对于对象成员所属类 Y的构造函数带有不可缺省的参数时,
则含有对象成员的类 X的构造函数的定义形式必须如下:
class X
{ 类名 1 对象成员名 1;

类名 n 对象成员名 n;
};
一般来说,类 X的构造函数的定义形式为:
X::X(形参表 0):对象成员名 1(形参表 1),…,
对象成员名 i(形参表 i),…,对象成员名 n(形参表 n)
{
// … 构造函数体
}
2、对象成员的特征对象成员的使用
class studentID
{ public:
studentID()
{ value=0;
cout<<“calling studentID”
<<value<<endl;
}
private:
int value;
};
class student
{ public:
student(char * n)
{ name=new char(strlen(n)+1);
strcpy(name,n);
cout<<”calling student”<<endl;
}
例 9.3
private,char*name;
studentID id;
};
void main()
{
student s(“Randy”);
}
对象成员的使用
class Tdate
{
public:
Tdate(int m,int d,int y);
~Tdate() {cout<<”Tdate Destructor called\n”;}
protected:
int moth,day,year;
};
Tdate::Tdate(int m,int d,int y)
{ month=m; day=d; year=y;
cout<<” Tdate constructor called\n”
}
例 9.4
class student
{ public:
student(char * n,char s,int m,int d,int y):birthday(m,d,y)
{ name=new char(strlen(n)+1);
strcpy(name,n);
sex=s;
cout<<”calling student”<<endl;
}
~student( ) { cout<<”student Destructor called\n”;}
private,char*name;
char sex;
Tdate birthday; //birthday为对象成员,它是 TDate的 对象
};
void main( )
{
student s1(“mike”,’m’,4,1,2000);
student s2(“tom”,’f’,5,19,1976);
}
作业:
2,深拷贝和浅拷贝
3、含有对象成员的类构造函数的定义方法小结
1,拷贝构造函数的定义和调用。
4、含有对象成员的类对象的创建和撤消过程