深浅拷贝,深浅赋值语句
在C++中,提供了六个默认的基本函数,分别是构造、拷贝构造、赋值、析构、一般对象的取地址符重载、常量对象取地址符重载。
当类中没有明确声明这六个当中的前三个,实例化、拷贝、赋值对象均采用默认函数进行。
在一般使用过程中,如果类的私有数据成员无指针类型时,可以不写这些函数,可是当私有数据成员有指针时,则必须写这些函数。
由于默认的拷贝构造和赋值语句仅仅只是简单的将私有数据划等号赋值,这就导致了一旦进行拷贝构造或者赋值,会产生两个对象的
数据成员对一份数据空间进行操作。而且,其在析构的时候则会对一个空间析构多遍,这是C++语法所不允许的。因此,默认拷贝构造
函数也被称为浅拷贝。默认赋值函数也被称之为浅赋值。
字符串类
//Test1.h #include<iostream> using namespace std; class STR { private: char *data; public: STR(char *a=""):data(a) { this->data = (char*)malloc(sizeof(a)*(strlen(a)+1)); strcpy(this->data, a); } ~STR() { free(this->data); this->data = NULL; } STR(STR &s); STR& operator=(const STR &s);
void print(); }; STR& STR::operator=(const STR &s) { if(this != &s) { free(this->data); this->data = NULL; this->data = (char*)malloc(sizeof(char)*(strlen(s.data)+1)); strcpy(this->data, s.data); } return *this; } STR::STR(STR &s) { this->data = (char*)malloc(sizeof(char)*(strlen(s.data)+1)); strcpy(this->data,s.data); }
void STR::print()
{
if(strlen(this->data) == 0)
cout<<""<<endl;
else
{
for(int i=0;i<strlen(this->data); ++i)
cout<<this->data[i];
cout<<endl;
}
}
深赋值语句四步骤(初级)
1.检查是否赋值给自身
2.释放原有空间(不管存不存在)
3.申请新的空间并赋值
4.返回自身对象
//Test.cpp #include<iostream> #include"Test1.h" using namespace std; void main() { STR str("ABCDEF"); STR str1(str); STR str2("MMMM"); str1 = str2;
str.print();
str1.print();
str2.print(); }
运行结果
不积小流无以成江河