您的位置:首页 > 编程语言 > C语言/C++

c++ 对象的复制与赋值

2016-01-13 20:42 393 查看
1、对象的赋值

如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象。这里所指的对象的值是指对象中所有数据成员的值。
对象之间的赋值也是通过赋值运算符"="进行的。本来,赋值运算符"="只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的(关于运算符的重载将在第4章中介绍)。实际上这个过程是通过成员复制(memberwise
copy)来完成的,即将一个对象的成员值一一复制给另一对象的对应成员。

对象赋值的一般形式为:对象名1=对象名2;

注意:对象名l和对象名2必须属于同一个类。
例如
Student studl,stud2;//定义两个同类的对象
stud2=studl;//将studl各数据成员的值赋给stud2
通过下面的例子可以了解怎样进行对象的赋值。

例9 对象的赋值。

#include <iostream>

using namespace std;

class Box
{public:
Box(int=10,int=10,int=10); //声明有默认参数的构造函数
int volume();
private:
int height;
int width;
int length; };

Box::Box(int h,int w,int len)
{height=h;
width=w;
length=len; }

int Box::volume()
{return(height*width*length); }//返回体积的值

int main()
{Box box1(15,30,25),box2; //定义两个对象box1和box2 
cout<<"The volume of box1 is "<<box1.volume()<<endl; //输山boxl的体积
box2=box1; //将box的值财给1box2 
cout<<"The volume of box2 is "<<box2.volume()<<endl; //输出box2的体积
return 0; }

运行结果如下:
The volume Of boxl is 11250
The volume Of box2 is 11250

说明:
(1)对象的赋值只对其中的数据成员赋值,不对成员函数赋值。数据成员是占存储空间的,不同对象的数据成员占有不同的存储空间,赋值的过程是将一个对象的数据成员在存储空间的状态复制给另一对象的数据成员的存储空间。而不同对象的成员函数是同一个函数代码段,不需要、也无法对它们赋值。
(2)类的数据成员中不能包括动态分配的数据,否则在赋值时可能出现严重后果(在此不作详细分析,只需记住这一结论即可)。

2、对象的复制

有时需要用到多个完全相同的对象:

其一般形式为:类名对象2(对象1); //用对象l复制出对象2。

有这就是对象的复制机制。用一个已有的对象快速地复制出多个完全相同的对象。

如:Box
box2(boxl);// 其作用是用已有的对象boxl去克隆出一个新对象box2。

可以看到:它与前面介绍过的定义对象方式类似,但是括号中给出的参数不是一般的变量,而是对象。在建立一个新对象时调用一个特殊的构造函数——复制构造函数(copy
constructor)。这个函数的形式是这样的:

//The copy constructor definition
Box::Box(const Box&b)
{height=b.height;
width=b.width;
length=b.length;}

说明:
1、复制构造函数也是构造函数,但它只有一个参数,这个参数是本类的对象(不能是其他类的对象),而且采用对象的引用的形式(一般约定加const声明,使参数值不能改变,以免在调用此函数时因不慎而使对象值被修改)。此复制构造函数的作用就是将实参对象的各数据成员值一一赋给新的对象中对应的数据成员。
2、复制对象的语句 Box
box2(boxl);这实际上也是建立对象的语句,建立一个新对象box2。由于在括号内给定的实参是对象,因此编译系统就调用复制构造函数(它的形参也是对象),而不会去调用其他构造函数。实参boxl的地址传递给形参b(b是boxl的引用),因此执行复制构造函数的函数体时,将boxl对象中各数据成员的值赋给borg中各数据成员。
3、用户可以在声明类时定义复制构造函数,如果用户自己未定义复制构造函数,则编译系统会自动提供一个默认的复制构造函数,其作用只是简单地复制类中每个数据成员。
4、还提供另一种方便用户的复制形式,用赋值号代替括号.
其一般形式为:类名对象名1=对象名2;
如:Box
box2=box1;//用boxl初始化box2
可以在一个语句中进行多个对象的复制,但是其作用都是调用复制构造函数。

5、对象的复制和1节介绍的对象的赋值在概念上和语法上的不同。

请注意普通构造函数和复制构造函数的区别。

(1)在形式上
类名(形参表列); //普通构造函数的声明,如Box(int,int
w,int leu);
类名(类名&对象名);//复制构造函数的声明,如Box(Box
&b);

(2)在建立对象时,实参类型不同。系统会根据实参的类型决定调用普通构造函数或复制构造函数。如
Boxboxl(12,15,l6);//实参为整数(普通数据类型),调用普通构造函数
Boxbox2(boxl); //实参是对象名(类数据类型),调用复制构造函数

(3)在什么情况下被调用
普通构造函数在程序中建立对象时被调用。

复制构造函数在用已有对象复制一个新对象时被调用,在以下3种情况下需要克隆对象:
①程序中需要新建立一个对象,并用另一个同类的对象对它初始化。
②函数的参数为类的对象时,在调用函数时需要将实参对象完整地传递给形参,也就是需要建立一个实参的拷贝,这就是按实参复制一个形参,系统是通过调用复制构造函数来实现的,这样能保证形参具有和实参完全相同的值。
③函数的返回值是类的对象。在函数调用完毕需要将返回值(对象)带回函数调用处时。此时需要将函数中的对象复制一个临时对象并传给该函数的调用处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息