对象的赋值

一。.复制构造函数:将已知对象的值复制到正在定义的同类型对象

复制构造函数是一个特殊的构造函数,具有一般构造函数的所有特性,它只有一个参数,参数类型是本类对象的引用。

复制构造函数的一般形式为:

<类名>(<类名>&<对象名>)

eg:

class Point
{
	float x,y;
public:
	Point();
	Point(float a, float b);
	~Point();
	Point(Point & obj);

	void Set(float a=0, float b = 0);
	void Display();
};
Point::Point()
{
	x = 0;
	y = 0;
	printf("构造Point\n");
}

Point::Point(float a, float b)
{
	x = a;
	y = b;
	printf("执行Point 构造函数\n");
}
Point::~Point()
{
	printf("析构Point\n");
}

Point::Point(Point & obj)
{
	x = obj.x;
	y = obj.y;
	printf("复制构造:%f, %f\n", x, y);
}

void Point::Set(float a/* =0 */, float b /* = 0 */)
{
	x = a;
	y = b;
	printf("Set: %f, %f\n", x, y);
}

void Point::Display()
{
	printf("Display: %f, %f\n", x, y);
}

int _tmain(int argc, _TCHAR* argv[])
{
Point a(53, 24);
	a.Display();
	Point b(a);
	b.Display();
	a.Set(10,20);
	Point c(a);
	c.Set(3.14, 8.29);
	c.Display();
	printf("现在a: ");
	a.Display();
	printf("现在b: ");
	b.Display();
	printf("现在c: ");
	c.Display();
	return 0;
}

执行结果:



程序中b的定义执行了复制构造函数,c的定义也用了复制构造函数。


复制构造函数的参数类型必须是自己所属类的引用类型。

复制构造函数在以下3种情况下被自动调用:

1. 用老对象定义该类的一个新对象时,eg:Point b(a)   Point c(a)

2. 如果函数的参数是对象,调用该函数时

3. 返回类型是对象时,也执行复制构造函数


二、重载赋值运算符

重载运算符的一般形式是:

       <运算结构类型>& operator<运算符>(<操作数表>)

重载"="的一般形式是:

<左值类型>& operator=(<操作数表>)

返回类型为引用可以避免生成临时对象,提高程序运行效率

赋值运算符"="的重载实现了对象之间的相互赋值

 eg:

class String
{
	char str[32];
public:
	String()
	{
		str[0] = '\0';
	}

	String & operator=(String &s)
};
String & String::operator=(String &s)
{
	if (this == &s)
		return *this;

	strcpy(str, s.str);
	return * this;
}
调用:
	String S1;
    S1="C++";
	String S2("面向对象");
	S2 = S1;
	S2.Display();
输出:

C++


在编写程序时,要进行对象赋值,不能直接使用赋值符号"=",应该对赋值运算符 "=" 进行重载

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/bosbear/article/details/8434393