1. 程式人生 > >C++ 拷貝構造

C++ 拷貝構造

class MyString {
private:
	char* _data;
	size_t   _len;
	void _init_data(const char *s) {
		_data = new char[_len + 1];
		memcpy(_data, s, _len);
		_data[_len] = '\0';
	}
public:
	MyString() {
		_data = NULL;
		_len = 0;
		cout << "構造" << endl;
	}

	MyString(const char* p) {
		_len = strlen(p);
		_init_data(p);
		cout << "構造:" << _data << endl;
	}

	MyString(const MyString& str) {
		_len = str._len;
		_init_data(str._data);
		cout << "拷貝構造: " << str._data << endl;
	}

	MyString& operator=(const MyString& str) {
		if (this != &str) {
			_len = str._len;
			_init_data(str._data);
		}
		cout << "等號:" << str._data << endl;
		return *this;
	}

	virtual ~MyString() {
		if (_data != NULL) {
			cout << "析構:"<< _data << endl; 
			free(_data);
		}
	}
};

void Test()
{
	MyString a;// 構造
	a = MyString("Hello");// 構造:Hello 等號:Hello 析構:Hello
        MyString b = MyString("Hi");//構造:Hi(沒有其他的了)
        MyString c = b;//拷貝構造:Hi
	std::vector<MyString> vec; 
	vec.push_back(MyString("World"));// 構造:World 拷貝構造:World 析構World
        //返回前:析構:World 析構:Hi 析構:Hi 析構:Hello
}