【c++string】拷贝构造和赋值运算符重载的深浅拷贝

目录

1.拷贝构造函数的深浅拷贝

2.赋值运算符重载的深浅拷贝


1.拷贝构造函数的深浅拷贝

拷贝构造的对象还没定义,把另一个已经定义了的对象拷贝构造给它

浅拷贝:

浅拷贝会使2个对象的成员变量指向同一块空间

  • 析构函数会使同一块空间被释放2次,不被系统允许
  • 改变一个对象,另一个对象也随之被改变和我们的需求不相符

1【c++string】拷贝构造和赋值运算符重载的深浅拷贝_第1张图片

namespace lj
{
	class string
	{
	public:
		string(const char* str = "")//构造函数
			:_str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}

		// s2(s1)
		string(const string& s)//拷贝构造,浅拷贝
		{
			_str=s.str;
		}
        ~string()//析构函数
		{
			cout << "~string()" << endl;
			delete[] _str;
			_str = nullptr;
		}

	private:
		char* _str;
	};
}
int main()
{
	lj::string s1("hello world");
	lj::string s2(s1);
	return 0;
}

 深拷贝:

深拷贝解决了两个对象的成员变量指向一块空间的问题

  • 析构函数会各种清理自己的资源
  • 改变一个对象,另一个不会随着改变,满足我们的需求

【c++string】拷贝构造和赋值运算符重载的深浅拷贝_第2张图片

namespace lj
{
	class string
	{
	public:
		string(const char* str = "")//构造函数
			:_str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}

		// s2(s1)
		string(const string& s)//拷贝构造,深拷贝
			:_str(new char[strlen(s._str) + 1])
		{
			strcpy(_str, s._str);
		}
        
        ~string()//析构函数
		{
			cout << "~string()" << endl;
			delete[] _str;
			_str = nullptr;
		}
	private:
		char* _str;
	};
}
int main()
{
	lj::string s1("hello world");
	lj::string s2(s1);
	return 0;
}

2.赋值运算符重载的深浅拷贝

两个对象都定义了,把一个给另一个

浅拷贝:

浅拷贝会使2个对象的成员变量指向同一块空间

  • 析构函数会使同一块空间被释放2次,不被系统允许
  • 改变一个对象,另一个对象也随之被改变和我们的需求不相符
namespace lj
{
	class string
	{
	public:
		string(const char* str = "")//构造函数
			:_str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}
		// s1 = s3
		string& operator=(const string& s)//赋值运算符重载,浅拷贝
		{
			if (this != &s)
			{
				_str=s.str;
			}

			return *this;
		}
		~string()//析构函数
		{
			cout << "~string()" << endl;
			delete[] _str;
			_str = nullptr;
		}

	private:
		char* _str;
	};
}
int main()
{
	lj::string s1("hello world");
	s1 = s3;

	return 0;
}

 深拷贝:

深拷贝解决了两个对象的成员变量指向一块空间的问题

  • 析构函数会各种清理自己的资源
  • 改变一个对象,另一个不会随着改变,满足我们的需求
namespace lj
{
	class string
	{
	public:
		string(const char* str = "")//构造函数
			:_str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}
		// s1 = s3
		string& operator=(const string& s)//赋值运算符重载,深拷贝
		{
			if (this != &s)
			{
				delete[] _str;
				_str = new char[strlen(s._str) + 1];
				strcpy(_str, s._str);
			}

			return *this;
		}
		~string()//析构函数
		{
			cout << "~string()" << endl;
			delete[] _str;
			_str = nullptr;
		}

	private:
		char* _str;
	};
}
int main()
{
	lj::string s1("hello world");
	s1 = s3;

	return 0;
}

你可能感兴趣的:(c++,c++,算法,c语言)