#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class MyString {
char* p;
public:
MyString(const char* s) {
cout << "构造函数被调用" << s << endl;
if (s) {
p = new char[strlen(s) + 1];
strcpy_s(p, strlen(s)+1, s);
}
else
p = NULL;
}
~MyString() { cout << "析构函数被调用" << p << endl; if (p) delete[] p; cout << "完成" << endl; }
};
int main()
{
const char* w1 = "xiejunyan", *w2 = "nmd";
MyString s1(w1);
s1 = w2;
}
在s1 = w2这句中, 编译器发现“没有赋值运算符的重载”,它认为,不能直接把const char*对象赋值给MyString对象,但是它发现可以用const char*来构造一个MyString对象,于是生成一个临时的MyString对象,开辟了“土地1”,放有w2的拷贝;
接着编译器调用了“本身的复制构造函数”,另s1的p也指向"土地1";
随后临时的MyString对象被析构,“土地1”消失;
最后s1想析构,可是却发现自己的p指向的“土地1”已经消失了;
构造函数被调用xiejunyan
构造函数被调用nmd
析构函数被调用nmd
完成
析构函数被调用葺葺葺葺