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