c++拷贝构造函数和赋值构造函数
    在C++中,对象的拷贝操作是很常见的。对象的拷贝操作包括两种情况:一是对象的初始化,如“类名对象(obj1)=类名对象(obj2)”;二是对象的赋值,如“obj1=obj2”。为了实现对象的拷贝操作,C++中提供了拷贝构造函数和赋值构造函数。本文将详细介绍C++中的拷贝构造函数和赋值构造函数。
    一、C++中的拷贝构造函数
    C++中的拷贝构造函数是一种特殊的构造函数,它用于完成一个对象到另一个对象的复制。拷贝构造函数的定义形式如下:
    类名(const 类名& obj){}
    其中,类名为其所在类的名称,&表示引用类型,obj为其他的同类对象。拷贝构造函数的目的是将一个对象复制到另一个对象中,使得两个对象完全相同。下面是一个示例:
    class point{
    private:
        int x;
        int y;
    public:
        point(int x=0,int y=0):x(x),y(y){}
        point(const point& p):x(p.x),y(p.y){}//拷贝构造函数
    };
    在上面的代码中,point类中有一个拷贝构造函数,用于将对象p复制到当前对象中。拷贝构造函数和普通构造函数在调用时是有区别的,普通构造函数传递的参数是要初始化的数据,而拷贝构造函数传递的参数是要复制的对象。拷贝构造函数的使用场景有以下几种情况:
    1、类参数传递
    在函数参数中,可以通过拷贝构造函数将一个类对象传递到函数中。如:
    void func(point p){
        cout<&_x()<<","<&_y()<<endl;
    }
    在上面的代码中,point类对象p被作为参数传递到func()函数中。这里的拷贝构造函数用来完成将一个point对象(p)复制到另一个point对象中。
    2、类返回值
    point func(){
        point p(1,2);
        return p;//将point对象p返回到主调函数中
    }
    在这里,point类的实例对象返回到主调函数中。这里的拷贝构造函数用来完成复制操作。
    3、类对象初始化
    point p1(1,2);
    point p2=p1;//通过拷贝构造函数将p1复制到p2中
    在这里,p1对象是通过构造函数初始化的,p2对象则是通过拷贝构造函数初始化的。拷贝构造函数将p1对象复制到p2对象中,使得它们两个是完全相同的。
    其中,operator=表示操作符=,&表示引用类型,obj为其他的同类对象。 赋值构造函数的作用和拷贝构造函数类似,也是将一个对象复制到另一个对象中。不同之处在于,赋值构造函数是在已存在的对象上对其进行赋值,而拷贝构造函数是在一个新对象中对其进行初始化。下面是一个示例:
    在上面的代码中,point类中有一个赋值构造函数,用于将对象p复制到当前对象中。它是通过操作符=实现的。操作符=是C++中的一个关键字,用于进行赋值操作。在这里,赋值构
造函数通过重载这个操作符,实现将一个对象复制到另一个对象中。赋值构造函数也可以在函数中进行自赋值检查,以避免内存泄漏。
    1、调用时机不同
    拷贝构造函数是在构造一个新对象时被调用,而赋值构造函数是在一个已存在的对象上对其进行赋值时被调用。
    2、参数不同
构造函数可以被重载    拷贝构造函数不需要返回任何值,而赋值构造函数需要返回一个该类的引用。
    总结
    在C++中,拷贝构造函数和赋值构造函数是两种不同的类型。它们分别用于实现对象间的复制和赋值操作。拷贝构造函数和赋值构造函数的调用时机和用途不同,需要根据实际情况来选择使用哪种类型的函数。在使用拷贝构造函数和赋值构造函数时,我们需要注意自赋值的情况,避免出现内存泄漏问题。