class String { private: char* ptr; public: String(char* s) { ptr = new char[strlen(s) + 1]; strcpy(ptr, s); } ~String() { delete ptr; } void print() { cout << ptr << endl; } void operator = (const String& s); }; void String::operator = (const String& s) { delete ptr; ptr = new char[strlen(s.ptr) + 1]; strcpy(ptr, s.ptr); } int main() { String p1("qian"); { String p2(""); p2 = p1; cout << "p2"; p2.print(); } cout << "p1:"; p1.print(); return 0; }
时间: 2023-06-27 15:05:25 浏览: 291
这段代码实现了一个简单的字符串类 String,其中包含了一个指向字符数组的指针 ptr。构造函数 String(char* s) 初始化了 ptr,并将 s 复制到 ptr 中;析构函数 ~String() 释放了 ptr 指向的内存;print() 函数打印 ptr 中的字符串;赋值运算符重载函数 operator=() 实现了深拷贝,即在赋值时先释放原有的内存,再将新的字符串复制到 ptr 中。
在 main 函数中,首先创建了一个字符串对象 p1,然后在一个作用域内创建了另一个对象 p2,将 p1 赋值给 p2,并打印 p2 和 p1 的值。需要注意的是,p2 在作用域结束时会被析构,因此赋值运算符重载函数必须正确实现深拷贝,否则会导致 p2 和 p1 指向同一块内存,p2 析构时会将内存释放掉,导致 p1 中的指针变成了野指针。
阅读全文