求教一个拷贝构造函数的问题

ysmashimaro 2008-08-27 11:06:34
#include<iostream>
using namespace std;
class Time
{
public:
Time(){cout<<"默认构造函数被调用!"<<endl;}
Time(int h,int m,int s):hour(h),minute(m),second(s){cout<<"带形参的构造函数被调用!"<<endl;}
Time(const Time& t):hour(t.hour),minute(t.minute),second(t.second){cout<<"复制构造函数被调用!"<<endl;}
Time operator =(Time& t){ hour=t.hour;minute=t.minute;second=t.second;cout<<"赋值重载函数被调用!"<<endl;return *this;}

private:
int hour;
int minute;
int second;
};

int main()
{
Time t=Time(2,3,4);
cout<<endl;
Time t2;
cout<<endl;
t2=t;
cout<<endl;
return 0;
}

运行结果是:

带形参的构造函数被调用!
复制构造函数被调用!

默认构造函数被调用!

赋值重载函数被调用!
复制构造函数被调用!

我想求教的问题是:"t2=t"这个语句除了调用赋值运算符重载,为什么还会调用复制构造函数?构造函数不是只在函数初始化时被调用吗?
望高手赐教.
...全文
82 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
budweiser 2008-08-27
  • 打赏
  • 举报
回复
Time& operator =(Time& t){ hour=t.hour;minute=t.minute;second=t.second;cout < <"赋值重载函数被调用!" < <endl;return *this;}
yyyapple 2008-08-27
  • 打赏
  • 举报
回复
#include <iostream> 
using namespace std;
class Time
{
public:
Time(){cout <<"默认构造函数被调用!" <<endl;}
Time(int h,int m,int s):hour(h),minute(m),second(s){cout <<"带形参的构造函数被调用!" <<endl;}
Time(const Time& t):hour(t.hour),minute(t.minute),second(t.second){cout <<"复制构造函数被调用!" <<endl;}
Time operator =(Time& t){ hour=t.hour;minute=t.minute;second=t.second;cout <<"赋值重载函数被调用!" <<endl;return *this;}
~Time(){cout <<"析构函数被调用!" <<endl;}
private:
int hour;
int minute;
int second;
};

int main()
{
Time t=Time(2,3,4);
cout <<endl;
Time t2;
cout <<endl;
t2=t;
cout <<endl;
return 0;
}


运行结果:
带形参的构造函数被调用!
复制构造函数被调用!

默认构造函数被调用!

赋值重载函数被调用!
复制构造函数被调用!
析构函数被调用!

析构函数被调用!
析构函数被调用!
yyyapple 2008-08-27
  • 打赏
  • 举报
回复
在你的设计中运算符=返回的是一个对象,
t2=t; 语句中的表达式返回一个临时变量,随后被析构,你在写一个析构函数看看
e_sharp 2008-08-27
  • 打赏
  • 举报
回复
Time& operator =(Time& t) {...} //返回Time& 
帅得不敢出门 2008-08-27
  • 打赏
  • 举报
回复

Time operator =(Time& t){ hour=t.hour;minute=t.minute;second=t.second;cout < <"赋值重载函数被调用!" < <endl;return *this;}
这个返回的是一个非引用对象,这样就多了一次复制构造函数的调用了.

如果改成这样,返回引用
Time& operator =(Time& t){ hour=t.hour;minute=t.minute;second=t.second;cout < <"赋值重载函数被调用!" < <endl;return *this;}

则就只有 赋值重载函数被调用!
Vegertar 2008-08-27
  • 打赏
  • 举报
回复
将赋值运算符的重载函数改一下,这样就会只调用赋值重载函数.

Time& operator =(const Time& t)
{
hour=t.hour;
minute=t.minute;
second=t.second;
cout <<"赋值重载函数被调用!" <<endl;
return *this;
}

taojian_hhu 2008-08-27
  • 打赏
  • 举报
回复
对于赋值操作符来说,它首先会生成临时对象,然后在赋值。在创建临时对象的时候就隐含调用了拷贝构造函数
ttkk_2007 2008-08-27
  • 打赏
  • 举报
回复
你的Time operator =(Time& t)应该返回Time&

64,282

社区成员

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

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