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