C++ 中拷貝構造函數和賦值運算符的區別

顧名思義,拷貝構造函數就是用另一個對象去初始化一個對象,
而賦值是對已構造的(被初始化的)對象重寫(賦值)
A a;
A b(a);A c = a;都是調用的拷貝構造函數

A d;
b = d;c = d;都是調用的賦值操做符node

註釋:ios

用一個已存在的對象去 構造一個不存在的對象(構造以前不存在),就是拷貝構造.
用一個已存在的對象去 覆蓋另外一個已存在的對象,就是賦值運算.

1. 爲何要使用拷貝構造函數?

    請看如下程序,咱們建立了兩個Node對象,第二個對象的建立直接拷貝第一個已建立的對象。而後咱們想修改第二個對象node2的name字段,採用庫函數strcpy()。可是並無獲得預期的結果。
   
函數

#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;
    }

}
;

void  main()
{
    Node node1(
"Roger"20);
    Node node2(node1);
//建立了對象node1的逐位複製件,且包含了一個指向對象node1的指針

    strcpy(node2.name, 
"Wendy");//修改node2的name的同時,node1的name也被修改
    node2.age=30;

    cout
<<node1.name<<' '<<node1.age<<' '
        
<<node2.name<<' '<<node2.age<<endl;
}


運行結果:
Wendy 20 Wendy 30

    解決辦法是使用顯式的拷貝構造函數,程序以下所示:

this

#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;
    }

}
;

void  main()
{
    Node node1(
"Roger"20)
    Node node2(node1);
//調用了顯式的拷貝構造函數

    strcpy(node2.name, 
"Wendy");
    node2.age
=30;

    cout
<<node1.name<<' '<<node1.age<<' '
        
<<node2.name<<' '<<node2.age<<endl;
}


運行結果:
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

相關文章
相關標籤/搜索