C++ 中拷贝构造函数和赋值运算符的区别

顾名思义,拷贝构造函数就是用另外一个对象去初始化一个对象,
而赋值是对已构造的(被初始化的)对象重写(赋值)
A a;
A b(a);A c = a;都是调用的拷贝构造函数

A d;
b = d;c = d;都是调用的赋值操作符

注释:

用一个已存在的对象去 构造一个不存在的对象(构造之前不存在),就是拷贝构造.
用一个已存在的对象去 覆盖另一个已存在的对象,就是赋值运算.

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

    解决办法是使用显式的拷贝构造函数,程序如下所示:

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


你可能感兴趣的:(C++ 中拷贝构造函数和赋值运算符的区别)