C++类中成员有指针时的注意事项

本文讨论了在C++类中包含指针成员时,如何处理拷贝构造函数和赋值运算符以避免浅拷贝导致的问题。通过示例展示了错误的实现以及如何修正,强调了深拷贝的重要性。此外,提到了`new int[0]`的潜在风险和`sort`函数在处理含有指针成员对象时的要求。
摘要由CSDN通过智能技术生成
关于类中有new初始化的指针成员.可能出现的问题

分享的内容

  1. 默认拷贝(复制)构造函数、赋值运算符,以及显式拷贝构造函数、赋值运算符
  2. int* p = new int[0]
  3. algrithm库中的sort函数


拷贝(复制)构造函数、赋值运算符

类对象的成员经常需要动态分配内存。例如int* path.用于保存遍历的节点,申请不同的字节长度满足规模大小不同的需求。

如同默认构造函数,当没有定义拷贝(复制)构造函数、赋值运算符时,系统提供默认的拷贝(复制)构造函数、赋值运算符,但是只是简单地将一个对象的数据成员给另一个对象的数据成员进行初始化/赋值(浅拷贝)。当成员有指针时,指针的值(指向的内存块地址)也会一致,两个指针就指向同一内存块。需要显式定义,在函数中重新申请内存(深拷贝),让指针指向申请的内存块,再赋值。

错误的程序例子:

#include <iostream>
#include <string>

using namespace std;

class Test
{
public:
	Test();
	Test(int n);
	~Test();
	void show();

private:
	int length;
	int* path;
};

Test::Test():
	length(0)
{
	cout << "Copy_String::Default Constrution Called." << endl;
	path = NULL;
}
Test::Test(int n)
{
	cout << "Copy_String::Constrution Called." << endl;
	length = n;
	path = NULL;//看上去可能多此一举,但是如果new数据内存分配失败,还可以在其他地方先行判断if(path==NULL)
	path = new int[n];
	if (path != NULL)
	{
		int i;
		for (i = 0; i < length; i++)
		{
			path[i] = i;
		}
	}
	else {
		cout << "path[] alloc failed.\n";
	}
}
Test::~Test()
{
	cout << "Copy_String::Destruction Called." << endl;
	cout << endl;
	if (path != NULL)
	{
		delete[] path;
		path = NULL;
	}
}
void Test::show()
{
	cout << "length:" << length << endl;
	cout << "path:";
	int i;
	for (i = 0; i < length; i++)
	{
		cout << path[i] << " ";
	}
	cout << endl;
	cout << "path.address = " << path << endl;
}

int main()
{
	cout << "无参构造函数.构造对象a" << endl;
	Test a;
	a.show();
	cout << endl;

	{
		cout << "默认赋值运算符.带参对象c给对象a赋值.对象c在函数体内\n";
		Test c(5);
		a = c;
		cout << "c.show()\n";
		c.show();
		cout << "a.show()\n";
		a.show();
		cout << endl;
	}
	cout << "对象c生命周期结束...";
	cout << "a.show()\n";
	a.show();


	cin.get();
	return 0;
}

程序输出:

对象c和

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值