拷贝构造函数问题????????????????高手帮忙!!!!!!!!!!!!!

bumm 2005-09-01 05:37:45
代码如下:
#include <iostream>

using namespace std;

class Internet
{
protected:
char name[20];
char address[30];
char* cname;
public:
Internet(char* name,char* address)
{
cout<<"载入构造函数"<<endl;
strcpy(Internet::name,name);
strcpy(Internet::address,address);
cname = new char[strlen(name)+1];

if(cname != NULL)
{
strcpy(Internet::cname,name);
}
}

Internet(Internet &temp)
{
cout<<"载入COPY构造函数"<<endl;
strcpy(Internet::name,temp.name);
strcpy(Internet::address,temp.address);
cname = new char[strlen(name)+1];

if(cname != NULL)
{
strcpy(Internet::cname,name);
}
}

~Internet()
{
cout<<"载入析构函数"<<endl;
delete[] cname;
cin.get();
}

void show();
};

void Internet::show()
{
cout<<name<<":"<<address<<cname<<endl;
}

void test(Internet ts)
{
cout<<"载入test函数"<<endl;
}

void main()
{
Internet a("中国软件开发实验室","www.cndev-lab.com");
Internet b = a;
b.show();
test(b);
}
_____________________________________________________________________________________
输出结果如下:

载入构造函数
载入COPY构造函数
中国软件开发实验室:www.cndev-lab.com中国软件开发实验室
载入COPY构造函数
载入test函数
载入析构函数

????????为什么输出两遍"载入COPY构造函数"???????????
...全文
242 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
waynahu 2005-09-02
  • 打赏
  • 举报
回复
同意 zhouhuahai(道号"虚无") 的说法
zhouhuahai 2005-09-02
  • 打赏
  • 举报
回复
哦,谢谢各位的指正.

Internet b = a; 这里不管有没有定义operator =,都是调用copy ctor
csdolauli 2005-09-02
  • 打赏
  • 举报
回复
void test(Internet ts)
改为传引用就不会了
SammyLan 2005-09-01
  • 打赏
  • 举报
回复
????????为什么输出两遍"载入COPY构造函数"???????????

Internet b = a;
这是第一次,因为未定义operator =,所以调用copy ctor

test(b);
这是第二次,因为参数b是按值传递,会复制一个临时对象,再在函数调用结束后析构之.

另外,楼主的copy ctor没设计好,会造成内存泄漏!
应该先delete原先的指针,再new.并且应该先检查是否为自赋值!否则可能出现野指针....呵呵


Internet b = a; 调用拷贝构造函数
Internet b ; 调用构造函数
b=a 调用默认的'='操作符
little_duck 2005-09-01
  • 打赏
  • 举报
回复
Internet b = a; //1次 b=a 和b(a)是一样的效果所以是执行copy

test(b); //2次 因为在这里编译器会产生临时对象 需要进行copy构造,如果你想只一次的话 这里可以用引用

test(b);操作可以被编译器解析为以下操作↓
/////////////////////////////////////////////////////////////////
Internet aa//临时对象
aa.Internet::Internet(b)//注意产生COPY构造
test(&)//注意转换成引用
foochow 2005-09-01
  • 打赏
  • 举报
回复
调用的COPY构造函数地方就是楼上说的那两个,注意的地方就是Internet b = a;这样是调用COPY构造函数而不是opeator=运算,这里比较容易搞错.
yuanyou 2005-09-01
  • 打赏
  • 举报
回复
Internet b = a; //初始化调用拷贝构造函数
b.show();
test(b); //按值传递,语法跟初始化一样,所以又调用拷贝构造函数
zyfire88 2005-09-01
  • 打赏
  • 举报
回复
Internet b = a;
---------------------------
当一个对象初始化另一个对象的时候调用复制构造函数
test(b);
---------------------------
当一个对象当做参数传递的时候调用复制构造函数
lyclowlevel 2005-09-01
  • 打赏
  • 举报
回复
如果改成const Internet *temp; 那就不是拷贝构造函数了????那是什么东东阿?
==========================================================================

就是普通的构造函数。
indentify 2005-09-01
  • 打赏
  • 举报
回复
答案在这里
***********************************************
void test(Internet ts) //留意参数
{
cout<<"载入test函数"<<endl;
}
***********************************************

问题就在于参数:Internet ts
这时编译器会自动调用class Internet的构造函数
从而生成一个叫做ts的Internet类
该类生存期在void test(Internet ts)函数里
bumm 2005-09-01
  • 打赏
  • 举报
回复
如果改成const Internet *temp; 那就不是拷贝构造函数了????那是什么东东阿?
lyclowlevel 2005-09-01
  • 打赏
  • 举报
回复
就是按值传递才会调用拷贝构造函数。
lyclowlevel 2005-09-01
  • 打赏
  • 举报
回复
但是如果copy ctor中的参数改为const Internet* temp,就不会出现这种现象.
================================================================

如果改成const Internet *temp; 那就不是拷贝构造函数了。
=====================================================
还有,zhouhuahai(道号"虚无") 的解释有点问题。即使定义了
operator=,也是一样的。因为:
Internet a=b;
a=b;
两者是不同的。上面的那个调用拷贝构造函数,而后者调用
operator=。
bumm 2005-09-01
  • 打赏
  • 举报
回复
test(b);参数b不也是按值传递吗??
bumm 2005-09-01
  • 打赏
  • 举报
回复
但是如果copy ctor中的参数改为const Internet* temp,就不会出现这种现象.
zhouhuahai 2005-09-01
  • 打赏
  • 举报
回复
????????为什么输出两遍"载入COPY构造函数"???????????

Internet b = a;
这是第一次,因为未定义operator =,所以调用copy ctor

test(b);
这是第二次,因为参数b是按值传递,会复制一个临时对象,再在函数调用结束后析构之.

另外,楼主的copy ctor没设计好,会造成内存泄漏!
应该先delete原先的指针,再new.并且应该先检查是否为自赋值!否则可能出现野指针....呵呵

bumm 2005-09-01
  • 打赏
  • 举报
回复
再顶
bumm 2005-09-01
  • 打赏
  • 举报
回复

64,654

社区成员

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

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