要求:写个String类(这个类在std里是有的,我们要自己实现自己的机制)
String类里面主要的有四个函数:构造函数、拷贝构造函数、赋值函数、析构函数
我们通过写这些函数来理解什么是拷贝构造函数
class String
{
pbulic:
char *m_data;
}
构造函数:
要求:将字符串通过构造函数赋到成员指针中
String( char *str )//无返回值、参数是个char的指针
{
int length = strlen(str);//看一下字符串的长度
m_data = new char[length + 1]//开辟字符串长度的空间,给‘\0’留个空间
strcpy(m_data,str);//将字符串拷贝到开辟的空间中
}
解析:构造函数
构造函数我们很熟悉,不过这个构造函数中多了个参数,逻辑也简单
拷贝构造函数:初始化其他新建对象(假如说是有x,y两个对象,x对象初始化过,就是成员变量改赋值的都赋值了,y对象建立但什么都还没有赋值,通过拷贝构造函数用对象x来初始化对象y)
String( String & other)//和构造函数唯一的区别在于参数是个本类的对象
{
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data,other.m_data);
}
解析:拷贝构造函数
通过上面可以看得出拷贝构造函数和构造函数的区别在于参数不同,这也是本质,是重载,特殊的一种拷贝构造函数而已
逻辑和构造函数中的相同,逻辑懂了怎么实现懂了,剩下的就是如何触发,怎么用
char *t = "1234向前走";
String A(t);//调构造函数
String B(A);//当你用本类的对象来初始化本类的对象的时候,调的是拷贝构造函数,不会调构造函数了(已经调过一种构造函数了,不会调两次构造函数了,拷贝构造也是构造)
String B = A;//也可以这样来代替上一句
赋值函数:将本类对象的值赋值给本类的另一个对象
Text & operator = ( Text & other)
{
m_data = other.m_data;
return other;
}
解析:赋值函数
没有new空间是构造的时候已经开辟好了,只是没有赋值
析构函数:释放new出来的空间