顾名思义,拷贝构造函数就是用另外一个对象去初始化一个对象,
而赋值是对已构造的(被初始化的)对象重写(赋值)
A a;
A b(a);A c = a;都是调用的拷贝构造函数
而
A d;
b = d;c = d;都是调用的赋值操作符
注释:
用一个已存在的对象去 构造一个不存在的对象(构造之前不存在),就是拷贝构造.用一个已存在的对象去 覆盖另一个已存在的对象,就是赋值运算.
1. 为什么要使用拷贝构造函数?
请看以下程序,我们创建了两个Node对象,第二个对象的创建直接拷贝第一个已创建的对象。然后我们想修改第二个对象node2的name字段,采用库函数strcpy()。但是并没有得到预期的结果。
































运行结果:
Wendy 20 Wendy 30
解决办法是使用显式的拷贝构造函数,程序如下所示:






































运行结果:
Roger 20 Wendy 30
3. 赋值运算符的重载
#include<iostream.h>
#include<string.h>
struct Node
{
char *name;
int age;
Node(char *n="", int a=0)
{
name=new char[strlen(n)+1];
strcpy(name, n);
age=a;
}
Node(const Node &n) //copy constructor
{
name=new char[strlen(n.name)+1];
strcpy(name, n.name);
age=n.age;
}
Node & operator=(const Node &n) //operator '=' overload
{
// 赋值操作符必须防止自身赋值 if(this!=&n)
{
if(name!=0)
delete []name;
name=new char[strlen(n.name)+1];
strcpy(name, n.name);
age=n.age;
}
return *this;
}
};
void main()
{
Node node1("Roger", 20);
Node node2;
node2=node1; //调用重载的赋值运算符
strcpy(node2.name, "Wendy");
node2.age=30;
cout<<node1.name<<' '<<node1.age<<' '
<<node2.name<<' '<<node2.age<<endl;
}
运行结果:
Roger 20 Wendy 30