参考文章,更为详细https://www.cnblogs.com/yibeimingyue/p/12301430.html 字符串类的例子,是侯老师自己写的,因为标准库的例子功能太复杂了。
编译器提供的拷贝赋值只是拷贝了对象的指针,没有真正拷贝对象。
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);
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) {
return *this;
}
delete[] m_data;
auto len = strlen(str.m_data);
m_data = new char[len + 1];
memset(m_data, 0, len + 1);
strcpy(m_data, str.m_data);
return *this;
}
重载<<
inline ostream&
operator<<(ostream& os, const String& str) {
os << str.get_c_str();
return os;
}
补充内容:
|