浅拷贝和深拷贝

知道了拷贝构造函数的基本用法之后,还需明白不同的类,所需的拷贝构造函数写法不同。
根据类中是否有带指针的数据成员,来判断写哪种拷贝构造函数。

1.不带指针—浅拷贝。

#include <iostream>
using namespace std;
class complexs
{
	private:
		double Real;
		double Image;
	public:
		complexs(double a,double b): Real(a),Image(b){}
		complexs(const complex& com):Real(com.Real),Image(com.Image){}//初始化列表
		inline double getReal()const{return Real;}//内联函数,const加在()后,表明不能通过该函数的this指针修改内容。
		inline double getImage()const{return Image;}
};
int main()
{
	complexs c(3,4);
	complexs b = c;
	cout << "Real: " << b.getReal() << " Image: " << b.getImage() << endl;
	return 0;
}

以上是不带指针的简单示例。
2.带指针 —深拷贝

#include <iostream>
#include <cstring>
using namespace std;
class strings
{
	private:
		char* str;
	public:
		strings(char* s):str(s){}
		strings(const string& s);
		strings& operator=(const strings& s);
		inline char* getchar()cosnt{ return str;}
};
strings::strings(const strings& s)
{
	str = new char [strlen(s.str)+1];
	strcpy(str,s.str);
}
strings& strings::operator=(const strings& s)
{
	if(this == &s) return *this;//判断是否为同一个对象
	delete [] str; // 先删除之前的内存
	str = new char [strlen(s.str) + 1];//重新分配内存
	strcpy(str,s.str);
	retrun *this;
}
int main()
{
	strings s("Hello world!");
	strings a = s;
	cout << a.getchar()<< endl;
	strings b("every thing goes well ");
	a = b;
	cout << a.getchar() << endl;
	return 0;
}

深拷贝不能像浅拷贝那样直接赋值,如果那样做,两个对象的str指针指向同一处,如果其中一个对象删除了,那么另外一个指针还指向那个已经被释放的内存,如果操作,将会有不可预知的后果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值