同类的对象之间可以互相赋值,即一个对象的值可以赋值给另一个对象。对象之间的赋值通过“=”进行。默认就是把一个对象所有非static数据成员的值依次赋值给另一个对象。
对象赋值的一般形式为:
对象名1 = 对象名2;
注意:对象名1和对象名2必须是属于同一个类的两个对象。
例如:
Person pl,p2;//定义两个同类的对象
//...... //这里省略p2初始化的过程
p1 = p2; //将p2各数据成员的值赋给p1
例如:对象赋值
class Cuboid //长方体
{
public:Cuboid(int len= 0, int wid= 0, int hei= 0); //有默认参数的构造函数void show();//输出每个成员变量的值
private:int length; //长int width; //宽int height; //高
};
Cuboid::Cuboid(int len, int wid, int hei)
{length = len;width = wid;height = hei;
}void Cuboid::show()
{cout << "长=" << length << ",宽=" << width << ",高=" << height << endl;
}int main()
{Cuboid Cub1, Cub2{10,20,30}; //定义两个对象Cub1和Cub2cout << "Cub1的:";Cub1.show();cout << "Cub2的:";Cub2.show();Cub1 = Cub2; //将Cub2的值赋给Cub1cout << "Cub1=Cub2后: " << endl;cout << "Cub1的:";Cub1.show();return 0;
}
说明:
(1)对象的赋值只对其中的数据成员赋值,不对成员函数赋值。每个对象的数据成员占用独立的存储空间,不同对象的数据成员占有不同的存储空间,赋值的过程是将一个对象的数据成员在存储空间的值复制给另一个对象的数据成员的存储空间。而不同对象的成员函数是同一个函数代码段,不需要、也无法对它们赋值。
(2)类的数据成员中不能包括动态分配的数据,否则在赋值时可能出现意想不到的严重后果(这个问题在后面的运算符重载讲解)。
总结:
如果类的数据成员有指针,则一定要实现如下函数
●构造函数 (如果没有,会出现野指针)
●拷贝构造函数 (如果没有,会出现浅拷贝)
●重载 = 符号 (如果没有,会出现浅拷贝)
●析构函数 (如果没有,会出现内存泄漏)