深入了解string的深浅拷贝

c++中类中有默认的构造函数,其中就有拷贝构造,默认的拷贝构造按照字节进行拷贝

按字节拷贝的问题在于:如果该空间为指针变量,且指向一块正在管理的空间,当浅拷贝之后,就会有两个变量同时管理这块空间,当生命周期结束后,也会随之析构两次,这是不允许的。
因此这种情况下,我们需要手动实现拷贝构造,简单来说,我们需要开辟空间,将原来管理的空间赋值一份,这样,一人一份就没有纠纷了。

string深拷贝的实现,以及传深拷贝统写法与现代写法。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
using namespace std;
namespace mystring {
	class string {
	public:
		//传统写法与现代写法
		string(const char* str = "")
			:_str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}
		string(const string& str) 
			:_str(new char[strlen(str._str) + 1])
		{
			strcpy(_str, str._str);
		}
		string& operator=(const string& str) {
			if (this != &str) {
				string tmp(str._str);
				swap(tmp._str, _str);
			}
			return *this;
		}
		string& operator=(string str) {//传值一次性拷贝
			if (this != &str) {
				swap(str._str, _str);
			}
			return *this;
		}

		//传统写法
		string& operator=(const string& str) {
			if (&str != this) {
				char* tmp = new char[strlen(str._str) + 1];
				strcpy(tmp, str._str);
				delete[] _str;
				_str = tmp;
			}
			return *this;
		}
		~string() {
			delete[] _str;
			_str = nullptr;
		}
		size_t size() {
			return strlen(_str);
		}
		char& operator[](size_t i) {
			return _str[i];
		}
	private:
		char* _str;
	};
}
int main() {
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ifwecande/article/details/107897195