顧名思義,拷貝構造函數就是用另一個對象去初始化一個對象,
而賦值是對已構造的(被初始化的)對象重寫(賦值)
A a;
A b(a);A c = a;都是調用的拷貝構造函數
而
A d;
b = d;c = d;都是調用的賦值操做符node
註釋:ios
用一個已存在的對象去 構造一個不存在的對象(構造以前不存在),就是拷貝構造.1. 爲何要使用拷貝構造函數?
請看如下程序,咱們建立了兩個Node對象,第二個對象的建立直接拷貝第一個已建立的對象。而後咱們想修改第二個對象node2的name字段,採用庫函數strcpy()。可是並無獲得預期的結果。
函數
運行結果:
Wendy 20 Wendy 30
解決辦法是使用顯式的拷貝構造函數,程序以下所示:
this
運行結果:
Roger 20 Wendy 30spa
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;
} blog
運行結果:
Roger 20 Wendy 30
string