首页
论坛
课程
招聘
p253 疑问依旧存在,版主来看看吧,不知道是错误 还是我理解错了?
2012-3-22 22:46 5408

p253 疑问依旧存在,版主来看看吧,不知道是错误 还是我理解错了?

2012-3-22 22:46
5408
p253 第三行说道
“因为这样的代码不是MyString在定义时赋初值,所以不会触发MySring的拷贝构造函数”

看到这个里  我产生的疑惑  记得映象里是依旧调用的
所以在vs2010 和vc6.0中都实验了下 都有调用
代码如下:
#include <stdio.h>
#include<stdlib.h>
#include <IOSTREAM>

class CMyString
{
public:
	CMyString()
	{
		m_pString=NULL;
	}
	CMyString(CMyString& obj)
	{
		printf("复制构造函数");
		int len=strlen(obj.m_pString)+1;
		this->m_pString=new char[len];
		strcpy(this->m_pString,obj.m_pString);
	};
	CMyString& operator=(const CMyString& aMess)
	{
		int len=strlen(aMess.m_pString)+1;
		this->m_pString=new char[len];
		strcpy(this->m_pString,aMess.m_pString);
		return *this;

	}
	
	~CMyString()
	{
		if (m_pString!=NULL)
		{
			delete[] m_pString;
			m_pString=NULL;
		}
	}
	void SetString(char* pString)
	{
		int nLen=strlen(pString)+1;
		if (m_pString!=NULL)
		{
			delete [] m_pString;
			m_pString=NULL;
		}
		m_pString=new char[nLen];
		strcpy(m_pString,pString);
	}
	
	char* m_pString;

};
//
void show(CMyString MYstring)
{
	printf(MYstring.m_pString);
}

CMyString GetMyString()
{
	CMyString MYstring;
	MYstring.SetString("abc");
	return MYstring;
}

int main()
{
	
	CMyString na;
	na=GetMyString();
	getchar();
	return 0;
}


【公告】【iPhone 13、ipad、iWatch】11月15日中午12:00,看雪·众安 2021 KCTF秋季赛 正式开赛【攻击篇】!!!文末有惊喜~

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 959
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ybhdgggset 活跃值 2012-3-22 23:28
2
0
lz比较一下debug和release版
雪    币: 8
活跃值: 活跃值 (24)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
zpsemo 活跃值 2012-3-22 23:37
3
0
感谢 确实变成release 就没有输出信息了 书上没指明就有点混了
雪    币: 8
活跃值: 活跃值 (24)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
zpsemo 活跃值 2012-3-23 09:24
4
0
昨天想了一下 还是有问题
比如改了main函数
  CMyString na;
  na=GetMyString();
  show(na);
调试了下 无论在debug和release版都会调用复制构造函数
之前之所以没有输出是因为main函数代码内没有对na这个对象的其他引用,因此省略

所以不论是在申请对象处赋值 或 先申明对象再赋值  都会调用复制构造函数?
雪    币: 959
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ybhdgggset 活跃值 2012-3-23 18:54
5
0
void show(CMyString MYstring)
{
	printf(MYstring.m_pString);
}

这里会发生拷贝构造函数,因为是传值,
debug版程序执行结果为
复制构造函数复制构造函数abc

release版为
复制构造函数abc


若该为传引用方式
void show(CMyString& MYstring)
{
	printf(MYstring.m_pString);
}

debug版为
复制构造函数abc

release版为
abc

主函数为
int main()
{

	CMyString na;
	na=GetMyString();
	show(na);
	getchar();
	return 0;
}
雪    币: 8
活跃值: 活跃值 (24)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
zpsemo 活跃值 2012-3-23 22:45
6
0
谢谢指教 可能是我没说清楚问题
我也清楚当为引用指针的时候就不会调用 不会拷贝形参
这两段代码:
CMyString MyString=getMyString();


CMyString MyString
MyString=getMyString();


书中的意思是说  当没有在定义对象的时候赋初值,而是在定义之后,那么就不会触发复制构造函数
于是我才在main函数中 分别测试这两种赋值情况
结果都调用复制构造函数(无论在release或者在debug) 所以怀疑书是不是打错了?
雪    币: 887
活跃值: 活跃值 (653)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
backer 活跃值 1 2012-3-24 04:36
7
0
这好像是个C++的语法问题
CMyString MyString=getMyString();  // 这里是MyString的拷贝构造函数被调用

CMyString MyString
MyString=getMyString();                  // 这里是getMyString()的返回对象拷贝给函数外的临时对象

虽然都是调用了拷贝函数,但是调用的时机不同,对象不同,你可以尝试在拷贝函数中显示this指针的值,以验证
雪    币: 8
活跃值: 活跃值 (24)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
zpsemo 活跃值 2012-3-24 09:41
8
0
嗯 都有调用就好了 那我就明白了 原来还有配合后面的话 也就是不是在赋初值的时候调用而是在返回临时对象的时候的...
雪    币: 959
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ybhdgggset 活跃值 2012-3-24 10:07
9
0
感谢版主,打印this指针后,比较清晰
雪    币: 887
活跃值: 活跃值 (653)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
backer 活跃值 1 2012-3-24 16:05
10
0
这是C++基本语法问题,本书假定读者己掌握C++,所以没涉及语法讲解
游客
登录 | 注册 方可回帖
返回