拷贝构造函数
也是构造函数的一种,常用来以另一对象为模板创建新对象。如果对象中没有指针,可以直接使用数据库自带的该函数,但有指针就需要自己构建,这是为了避免造成浅拷贝,使两个指针指向同一内存空间。
例如
string s1;
string s2(s1);
拷贝赋值函数
作用和拷贝构造函数基本一致,区别在于拷贝构造的对象是新创建的,而赋值函数则是原来就有的。
在代码表示上也有所不同
拷贝构造如下:
inline string::string( const string& str)
{
m_data=new char[strlen(str.m_data+1)];
strcpy(m_data;str.m_data);
}
而拷贝赋值则多了监测是否为自我赋值、删除已有堆空间等操作。
代码如下:
inline string&string ::operator =(const string &str)
{
if(this==&str)
return this;
delete[] m_data;
m_data=new char[strlen(str.m_data+1)];
strcpy(m_data;str.m_data);
return this;
}
深浅拷贝差别是什么?
浅拷贝:如果复制的对象中引用了一个外部内容(例如分配在堆上的数据),那么在复制这个对象的时候,让新旧两个对象指向同一个外部内容,就是浅拷贝。(指针虽然复制了,但所指向的空间内容并没有复制,而是由两个对象共用,两个对象不独立,删除空间存在)
深拷贝:如果在复制这个对象的时候为新对象制作了外部对象的独立复制,就是深拷贝。
两种拷贝区别是什么?
1)拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象来进行赋值操作。
2)一般来说在数据成员包含指针对象的时候,需要考虑两种不同的处理需求:一种是复制指针对象,另一种是引用指针对象。拷贝构造函数大多数情况下是复制,而赋值函数是引用对象
3)实现不一样。拷贝构造函数首先是一个构造函数,它调用时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新的对象赋值给一个原有的对象,所以如果原来的对象中有内存分配要先把内存释放掉,而且还要检察一下两个对象是不是同一个对象,如果是,不做任何操作,直接返回。



