标准库中的string:C++初阶学习第六弹——string(1)——标准库中的string类-CSDN博客
前言:
目录
一、string类的构造
private:
char* _str;
我们先把模拟构造给出来再来讲解:
//为了区分标准库,我们用String
class String
{
public:
String(const char* str = "")
{
if (str == nullptr)
{
assert(false);
return;
}
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
void String_print()
{
cout << _str << endl;
}
private:
char* _str;
};
int main()
{
String s1("abc");
s1.String_print();
return 0;
}
运行结果:
二、string类的拷贝构造
模拟实现的代码如下:
String(const String& s)
: _str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
在这里我们主要来讲解一下深拷贝和浅拷贝的问题,我们放在一个完整的代码实例:
class String
{
public:
String(const char* str = "")
{
if (str == nullptr)
{
assert(false);
return;
}
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
String(const String& s)
: _str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
void String_print()
{
cout << _str << endl;
}
private:
char* _str;
};
int main()
{
String s1("abc");
s1.String_print();
String s2(s1);
s2.String_print();
return 0;
}
运行结果:
错误示范:
三、string类的析构函数
由于string类对象不管以哪个方式创建时,都需要用new来开辟空间,所以string的析构函数写法为:
~String()
{
if (_str) //检查一下_str是否为空,如果为空就不用再释放空间了
{
delete[] _str;
_str = nullptr;
}
}
四、string类的运算符重载
string类的运算符重载整体来说没啥难度,在这里我们也不做过多讲解,重点来讲解一下operator=的两种写法
1、operator=的传统写法
String& operator=(const String& s)
{
if (s._str != _str)
{
char* ptr = new char[strlen(s._str) + 1]; //+1是因为要多开辟一个空间存放\0
strcpy(ptr, s._str);
delete _str; //清空_str中可能有的数据
_str = ptr;
}
return *this;
}
2、operator=的现代写法
String& operator=(String s)
{
swap(_str, s._str); //swap函数算法库中存在,所以可以直接使用
return *this;
}
· 传统写法:
· 现代写法:
传统写法和现代写法的过程比较:
五、代码实例
//为了区分标准库,我们用String
class String
{
public:
String(const char* str = "")
{
if (str == nullptr)
{
assert(false);
return;
}
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
String(const String& s)
: _str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
//现代写法
String& operator=(String s)
{
swap(_str, s._str);
return *this;
}
传统写法
//String& operator=(const String& s)
//{
// if (s._str != _str)
// {
// char* ptr = new char[strlen(s._str) + 1]; //+1是因为要多开辟一个空间存放\0
// strcpy(ptr, s._str);
// delete _str; //清空_str中可能有的数据
// _str = ptr;
// }
// return *this;
//}
void String_print()
{
cout << _str << endl;
}
~String()
{
if (_str) //检查一下_str是否为空,如果为空就不用再释放空间了
{
delete[] _str;
_str = nullptr;
}
}
private:
char* _str;
};
int main()
{
String s1("abc");
s1.String_print();
String s2(s1);
s2.String_print();
String s3 = s2;
s3.String_print();
return 0;
}
运行结果:
六、总结
感谢各位大佬观看,创作不易,还请一键三连!!!