C++构造函数之浅拷贝和深拷贝

拷贝构造函数:将已存在的类对象的值赋值给类对象,进而达到复制已有对象中数据的目的:

#include <iostream>
#include <string>
using namespace std;
class My_Class
{
private:
	int x, y;
	//int *text;
public:
	My_Class() { x = 0; y = 0;  }
	My_Class(int a) { x = a; y = 0; }
	My_Class(int a, int b) { x = a; y = b; 	}
	~My_Class() { cout << "析构函数调用ing" << endl; }
	void clear() { x = 0; y = 0; }
	My_Class(const My_Class &another);
	int GetData();
	void InitData();
	void PrintData();
};
int My_Class::GetData()
{
	return x;
}
void My_Class::InitData()
{
	cin >> x >> y;
}
void My_Class::PrintData()
{
	cout << "x = " << x << ",y = " << y << endl;
}
My_Class::My_Class(const My_Class &another)
{
	x = another.x;
	y = another.y;
}
int main()
{
	int x;
	My_Class data1 = 100;
	data1.PrintData();
	My_Class data2(10, 11);
	data2.PrintData();
	My_Class data3(100);
	data3.PrintData();
	My_Class data4 = data2;
	data4.PrintData();
	My_Class data5(data2);
	data5.PrintData();
	return 0;
}


深拷贝和浅拷贝:

浅拷贝:由于类中没有定义复制构造函数,因此当调用对象函数是,只是将指针值济宁了复制,也就是说两个指针指向同一个内存区域。这种复制叫做浅拷贝;

深拷贝:由于在类中定义了复制构造函数,同时在复制构造函数中s指针申请了新的内存空间,因此x对象中的s所指向的内容并不发生变化。这种复制叫深复制。

//#include <iostream>
//#include <string>
//using namespace std;
//class My_Class
//{
//private:
// int x, y;
// //int *text;
//public:
// My_Class() { x = 0; y = 0;  }
// My_Class(int a) { x = a; y = 0; }
// My_Class(int a, int b) { x = a; y = b; }
// ~My_Class() { cout << "析构函数调用ing" << endl; }
// void clear() { x = 0; y = 0; }
// My_Class(const My_Class &another);
// int GetData();
// void InitData();
// void PrintData();
//};
//int My_Class::GetData()
//{
// return x;
//}
//void My_Class::InitData()
//{
// cin >> x >> y;
//}
//void My_Class::PrintData()
//{
// cout << "x = " << x << ",y = " << y << endl;
//}
//My_Class::My_Class(const My_Class &another)
//{
// x = another.x;
// y = another.y;
//}
//int main()
//{
// int x;
// My_Class data1 = 100;
// data1.PrintData();
// My_Class data2(10, 11);
// data2.PrintData();
// My_Class data3(100);
// data3.PrintData();
// My_Class data4 = data2;
// data4.PrintData();
// My_Class data5(data2);
// data5.PrintData();
// return 0;
//}
#include <iostream>
#include <string>
using namespace std;
class Cstring
{
private:
char *s;
public:
Cstring(const char*);
Cstring(const Cstring &);
void print(void) { printf("%s\n", s); }
void strcon(char *p);
};
void Cstring::strcon(char *p)
{
strcat(s, p);
}
Cstring::Cstring(const char *x)
{
s = new char[strlen(x) + 1];
strcpy(s, x);
}
Cstring::Cstring(const Cstring &x)
{
s = new char[strlen(x.s) + 10];
strcpy(s, x.s);
}
int main()
{
Cstring x("Good");
Cstring y = x;
x.print();
y.print();
y.strcon("morning!");
x.print();
y.print();
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值