请帮我解释一下这个默认拷贝构造函数!

ztwz 2004-09-25 04:18:57
我看的书是钱能的c++程序设计,看到默认拷贝构造函数这儿十在是晕得很,请大题帮我解惑!问题我都用注释写在代码相应位置了!谢谢
#include <iostream>
#include <string.h>

using namespace std;

class student
{
public:
student(char *pname="no name")
{
cout<<"1 新建一个类"<<pname<<endl;
strcpy(name,pname);
name[sizeof(name)-1]='\0';
}

student(student& s)
{
cout<<"2 拷贝类"<<s.name<<endl;
strcpy(name,"copy of");
strcat(name,s.name);
}

~student()
{
cout<<"3 消毁类"<<name<<endl;
}
protected:
char name[40];
};

class tutor
{
public:
tutor(student& s):student(s)
{
cout<<"4 建立tutor类\n";
}

protected:
student student;/*这儿这东东为什么在dev c++里编译出错 declaration of `student tutor::student我在vs.net里就没问题*/
};



void fn(tutor tutor)//函数执行到这儿的时候就构造tutor,而tutor又要复制student呀怎么没复制?
{
cout<<"5 在函数fn()中\n";
}

int main()
{
student randy("randy");
tutor tutor(randy);
cout<<"6 调用fn()\n";
fn(tutor);
cout<<"7 返回fn()\n";
}


这是运行后的结果:
1 新建一个类randy
2 拷贝类randy
4 建立tutor类
6 调用fn()
2 拷贝类copy ofrandy
5 在函数fn()中
3 消毁类copy ofcopy ofrandy
7 返回fn()
3 消毁类copy ofrandy
3 消毁类randy

按我的理解应该执行结果是这样的:
1 新建一个类randy
2 拷贝类randy
4 建立tutor类
6 调用fn()
2 拷贝类copy ofrandy
4 建立tutor类 //我的问题也就是多了这一步
5 在函数fn()中
3 消毁类copy ofcopy ofrandy
7 返回fn()
3 消毁类copy ofrandy
3 消毁类randy
...全文
82 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
made_in_ 2004-09-25
  • 打赏
  • 举报
回复
也是关于编译器实现的问题,由于采用的是浅copy,所以并不是直接重新构造一个tutor类。同样的,由于采用浅copy,类里的student也不会重新构造。
ztwz 2004-09-25
  • 打赏
  • 举报
回复
谢谢,我的哪个输出思路中多输出一个“4 建立tutor类”我的思路是哪儿错了?谢谢
made_in_ 2004-09-25
  • 打赏
  • 举报
回复
xteaj()正解。
对于某些编译器实现,如果用户定义了类的构造函数,则编译器就不会再为该类添加默认的无参数构造函数了。
解决办法也很简单,你再为该类添加一个无参数的构造函数则可。
  • 打赏
  • 举报
回复
class tutor
{
public:
tutor(student& s):student(s)
{
cout<<"4 建立tutor类\n";
}

protected:
student student;/*这儿这东东为什么在dev c++里编译出错 declaration of `student tutor::student我在vs.net里就没问题*/
};
与编译器有关,有的编译器见到有构造函数就不再给一个默认无参数构造函数了。

64,636

社区成员

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

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