类的赋值运算符

szn_409 2016-04-09 07:36:50

class CTest0
{
public:
CTest0()
{
p = new int[10]();
}

virtual ~CTest0()
{
delete []p;
}
CTest0* operator = (const CTest0* tem)
{
printf("CTest0* operator =\n");
if (this == tem) return this;
memcpy(this->p, tem->p, 40);
return this;
}

CTest0& operator = (const CTest0 &tem)
{
printf("CTest0& operator =\n");
if (this == &tem) return *this;
memcpy(this->p, tem.p, 40);
return *this;
}

public:
int *p;
};

int _tmain(int argc, _TCHAR* argv[])
{
{
CTest0 *T0_0 = new CTest0();
CTest0 *T0_1 = new CTest0();
T0_0 = T0_1; //并没有正确赋值
printf("\n");
}

{
CTest0 *T0_0 = new CTest0();
CTest0 *T0_1 = new CTest0();
T0_0->operator=(T0_1); //输出CTest0* operator = 正确赋值
printf("\n");
}

return 0;
}


如上代码 为什么第一次没有正确赋值
为什么一定要显示调用赋值运算符
...全文
191 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-04-10
  • 打赏
  • 举报
回复
第一种只是指针赋值,不会调用你的成员函数,因为全局就有指针赋值运算,需要写成第二种形式 如果需要对象赋值,写成:*T0_0 = *T0_1;
lm_whales 2016-04-10
  • 打赏
  • 举报
回复
CTest0* T0_1(&T0_0);已经正确赋值了,只是不是你想要的而已 T0_1 此时是&T0_0 的值 ,即T0_0的地址。 这才是 这个初始化语句的语义。 指针初始化的语义,就是用一个指针,初始化他, 包括指针常量,某个对象的地址,数组名等等 数组名,并不就是指针, 但是 C++要先去解析表达式,而不是看到数组名,就说他是啥。 解析表达式的时候,初始化指针的数组(给指针赋值的数组,等等情况下), 只能当指针用了,至于说隐式转换也好,数组名此时是指针也好。 他不过是解析表达式的结果而已。
renwotao2009 2016-04-09
  • 打赏
  • 举报
回复
拷贝构造和赋值操作符函数都是对对象进行的,不支持类指针类型,如果类指针类型,就必须明确调用
szn_409 2016-04-09
  • 打赏
  • 举报
回复
第二个问题漏贴了一段代码:


	CTest0(const CTest0& tem)
	{
		printf("CTest0&\n");
		p = new int[10]();
		if (this == &tem)	return;
		memcpy(this->p, tem.p, 40);
	}

szn_409 2016-04-09
  • 打赏
  • 举报
回复

class CTest0
{
public:
	CTest0()
	{
		p = new int[10]();
	}

	virtual ~CTest0()
	{
		delete []p;
	}
	CTest0(const CTest0* tem)
	{
		printf("CTest0*\n");
		if (this == tem)	return;
		p = new int[10]();
		memcpy(this->p, tem->p, 40);
	}
public:
	int *p;
};

int _tmain(int argc, _TCHAR* argv[])
{
	{
		CTest0 T0_0;
		CTest0 T0_1(T0_0);	//输出CTest0&		正确赋值
		printf("\n");
	}

	{
		CTest0 T0_0;
		CTest0* T0_1(&T0_0);   //没有正确赋值
		printf("\n");
	}
}
上述第二个也没有正确赋值,为什么?

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧