温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++深浅拷贝和string类的写法有哪些

发布时间:2022-03-10 12:30:30 来源:亿速云 阅读:134 作者:小新 栏目:开发技术

小编给大家分享一下C++深浅拷贝和string类的写法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    一、深浅拷贝

    拷贝这个词对于我们来说应该不陌生,比如我们平常的复制和粘贴就是拷贝;但是如果把拷贝这个词放到C++中来说就有一些复杂了,我们先来看一下什么是浅拷贝:

    下面用字符串类来模拟实现。

    class Astring
    {
    public:
    	//构造函数
    	Astring(const char* str = "")
    	{
    		_str = new char[strlen(str) + 1];
    		strcpy(_str, str);
    	}
    	//采用浅拷贝写的构造函数
    	Astring(const Astring& s)
    	{
    		_str = s._str;
    	}
    	//析构函数
    	~Astring()
    	{
    		delete[] _str;
    		_str = nullptr;
    	}
    private:
    	char* _str;
    };
    int main()
    {
    	Astring aa("hello C++");
    	Astring bb(aa); //这里调用拷贝构造
    	return 0;
    }

    当我们执行以上程序的话就会失败,结果如下:

    C++深浅拷贝和string类的写法有哪些

    分析如下图所示:

    C++深浅拷贝和string类的写法有哪些

    所以我们采用浅拷贝使用同一块空间是不行了,那么怎么办呢?当然是重新开一块和别人同样大小的空间,然后再把别人空间里面的内容给拷贝过来,而这样就是所谓的深拷贝了;我们还是用字符串类来模拟实现深拷贝:

    class Astring
    {
    public:
    	//构造函数
    	Astring(const char* str = "")
    	{
    		_str = new char[strlen(str) + 1];
    		strcpy(_str, str);
    	}
    	//采用深拷贝写的构造函数
    	Astring(const Astring& s)
    	{
    		_str = new char[strlen(s._str) + 1];
    		strcpy(_str, s._str);
    	}
    	//析构函数
    	~Astring()
    	{
    		delete[] _str;
    		_str = nullptr;
    	}
    private:
    	char* _str;
    };
    
    int main()
    {
    	Astring aa("hello C++");
    	Astring bb(aa);
    	return 0;
    }

    分析如下图所示:

    C++深浅拷贝和string类的写法有哪些

    二、string类的两种写法

    有了上面我们知道的深浅拷贝,所以我们明白类中的拷贝构造函数和赋值重载一定要用深拷贝来实现,不过拷贝构造函数和赋值重载还是有两种写法的。

    1. 传统写法

    传统写法就是要自己开辟空间自己来拷贝别人的东西,什么事情都要自己干,代码如下:

    //搞一个命名空间,里面实现自己写的string类
    namespace cjy
    {
    	class string
    	{
    	public:
    		//构造函数
    		string(const char* str = "")
    			:_str(new char[strlen(str) + 1])
    		{
    			strcpy(_str, str);
    		}
    		//拷贝构造函数
    		string(string& s)
    			:_str(new char[strlen(s._str) + 1])
    		{
    			strcpy(_str, s._str);
    		}
    		//赋值重载,s1=s3
    		string& operator=(const string& s)
    		{
    			if (this != &s)
    			{
    				char* tmp = new char[strlen(s._str) + 1];
    				delete[] _str;
    				_str = tmp;
    				strcpy(_str, s._str);
    			}
    			return *this;
    		}
    		//析构函数
    		~string()
    		{
    			delete[] _str;
    			_str = nullptr;
    		}
    	private:
    		char* _str;
    	};
    }

    2. 现代写法

    现代写法就是复用其它的函数,自己不用干活,交给其它函数来帮你实现,代码如下:

    //现代写法:拷贝构造、赋值重载函数
    namespace cjy
    {
    	class string
    	{
    	public:
    		//构造函数
    		string(const char* str = "")
    		{
    			_str = new char[strlen(str) + 1];
    			strcpy(_str, str);
    		}
    		//拷贝构造函数
    		string(const string& s)
    			:_str(nullptr)
    		{
    			string tmp(s._str);
    			std::swap(_str, tmp._str);
         	}
    		//赋值重载
    		string& operator=(string s)
    		{
    			std::swap(_str, s._str);
    			return *this;
    		}
    	private:
    		char* _str;
    	};
    }

    以上是“C++深浅拷贝和string类的写法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI