Class with pointer member(s) —— string 目标:
int main() {
String s1();
String s2("hello");
String s3(s1); // 拷贝构造函数
cout << s3 << endl;
s3 = s2; // 赋值运算符重载
cout << s3 << endl;
return 0;
}
注意
- 如果没有写拷贝构造函数和重载=(拷贝赋值),编译器默认有,忠实的一个bit一个bit的拷贝。
- 复数可以用默认,直接拷贝实部和虚部
- 但是如果有指针,不可以用默认的
- class with pointer member 必须有 copy ctor 和 copy op=
默认的是浅拷贝,我们要写深拷贝
三大函数
class String
{
public:
String(const char* cstr = 0); // 基础函数
String(const String& str); // 1.拷贝构造函数
String& operator=(const String& str); // 2.拷贝赋值 重载=
~String(); // 3.析构函数
char* get_c_str() const { return m_data; } // 不改data,const
private:
char* m_data;
};
构造函数 ctor 和 析构函数 dtor
inline
String::String(const char* cstr = 0) {
if (cstr) {
auto len = strlen(cstr);
m_data = new char[len + 1];
memset(m_data, 0, len+1);
strcpy(m_data, cstr);
}
else { // 未指定初值
m_data = new char[1];
*m_data = '\0';
}
}
inline
String::~String() // 防止内存泄漏
{
delete[] m_data;
}
拷贝构造函数 copy ctor
inline
String::String(const String& str) {
auto len = strlen(str.m_data); // 直接取另一个的data,因为兄弟之间互为friend
m_data = new char[len + 1];
memset(m_data, 0, len + 1);
strcpy(m_data, str.m_data);
}
拷贝赋值函数 copy assignment operator
- 注意!要检测自我赋值的情况
inline String&
String::operator=(const String& str) {
if (this == &str) { // 0.自我赋值检测,否则直接delete,没有数据了
return *this;
}
delete[] m_data; // 1.清空被赋值的内容
auto len = strlen(str.m_data);
m_data = new char[len + 1]; // 2.申请新的内存
memset(m_data, 0, len + 1);
strcpy(m_data, str.m_data); // 3.拷贝
return *this;
}