当前位置 博文首页 > ice_elephant的博客:标题拷贝构造函数和赋值构造函数编译器用法

    ice_elephant的博客:标题拷贝构造函数和赋值构造函数编译器用法

    作者:[db:作者] 时间:2021-09-16 15:52

    标题拷贝构造函数和赋值构造函数的区别

    c++中的拷贝构造函数
    例如看以下代码为了出于测试目的,所有类的函数都写在一个cpp文件里面。

    #include
    #include<Windows.h>

    using namespace std;

    class Test{

    public:

    Test(){
    
    }
    
    Test(const Test &other){
    
    	cout << "调用拷贝构造" << endl;
    }
    
    Test &operator=(const Test &other){
    
    	cout << "调用赋值构造" << endl;
    
    	return *this;
    }
    

    };

    int main(void){

    Test v1;
    
    Test v2(v1);//调用拷贝构造函数
    
    v2 = v1;//调用赋值构造函数
    
    system("pause");
    return 0;
    

    }
    外形方面总结:所谓赋值构造函数,就是将两个已经存在的对象,进行赋值运算。
    例如: Test v1,v2;
    v1=v2//此时是赋值构造函数
    Test v3(v1);//创建不存在的对象时,如上述调用拷贝构造函数。

    注意点:如果里面,存在着定义的指针,那么就存在这内存释放的问题
    以定义一个私有成员
    char *name;为例

    在拷贝构造函数中不需进行内存的释放,而在赋值构造函数中需进行内存的释放。
    (Vector 不是vector前者是一个大写的V!T是模板类)

    Vector& Vector::operator=(const Vector&object){

    if (m_base){
    	delete[] m_base;
    	
    }
    this->m_len = object.m_len;
    this->m_base = new T[m_len];
    	
    	
    	for (int i = 0; i < m_len; i++){
    	
    		m_base[i] = object.m_base[i];//why?
    	
    	}
    return *this;
    

    }
    简单理解,赋值构造函数是两个已经存在的对象进行赋值运算,当让需要释放掉内存。 而拷贝构造函数,是将一个已经存在的对象拷贝给一个即将出现的对象。那么这个即将出现的对象当然不需进行内存的释放。因为他都没有分配内存,那么还需要释放内存吗?答案是肯定不需要。
    //这里没有内存判定的释放!
    Vector::Vector(const Vector&object){

    cout << "调用拷贝构造函数" << endl;
    m_len = object.m_len;
    m_base = new T[m_len];
    for (int i = 0; i < m_len; i++){
    
    m_base[i] = object.m_base[i];
    }
    

    }

    cs