一。.复制构造函数:将已知对象的值复制到正在定义的同类型对象
复制构造函数是一个特殊的构造函数,具有一般构造函数的所有特性,它只有一个参数,参数类型是本类对象的引用。
复制构造函数的一般形式为:
<类名>(<类名>&<对象名>)
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++
在编写程序时,要进行对象赋值,不能直接使用赋值符号"=",应该对赋值运算符 "=" 进行重载