构造函数与析构函数

来自秘鲁的帕丁顿 2020-07-31 04:27:08
代码如下,运行环境为VS2019,运行结果中划线部分系统调用的构造函数是由哪一条语句得来的呢?
头文件:
class Tdate
{
public:
Tdate(int,int,int); //构造函数
Tdate(Tdate &t); //复制构造函数
~Tdate();
void print();
private:
int year,month,day;
};
Tdate::Tdate(int a,int b,int c) //构造函数的定义
{
year=a;
month=b;
day=c;
cout<<"This is the constructor"<<endl;
}
Tdate::Tdate(Tdate &t) //复制构造函数的定义
{
year=t.year;
month=t.month;
day=t.day;
cout<<"This is the copy-constructor"<<endl;
}
Tdate::~Tdate() //析构函数的定义
{
cout<<"The year of the destructed object is "<<year<<endl;
}
void Tdate::print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}

源文件:
#include <iostream>
using namespace std;
#include "fuzhigouzaohanshu2.h"
Tdate fun(Tdate Q); //声明函数fun(),形参为对象,返回类型为对象
void main()
{
Tdate t1(2010,6,22),t2(2011,7,23); //创建对象t1,t2并初始化,系统自动调用构造函数
Tdate t3(t1); //利用对象t1初始化新对象t3,系统自动调用复制构造函数
t2=fun(t3); //通过调用函数fun重新赋值对象t2
cout<<"t2对象的数据成员为:";
t2.print();
cout<<"t3对象的数据成员为:";
t3.print();
//程序结束,系统自动调用析构函数,释放对象数组t3,t2,t1内存空间
}
Tdate fun(Tdate Q) //形参为局部变量,需要分配内存空间,根据形参类型(对象),系统自动调用复制构造函数
{
cout<<"ok\n";
Tdate t4(2012,1,24); //创建对象t4并初始化,系统自动调用构造函数
return t4;
//函数调用完成,系统自动调用析构函数,释放对象t4和形参Q的内存空间
}

运行结果:
...全文
147 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-07
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
真相重于对错 2020-08-03
  • 打赏
  • 举报
回复
你的理解是错误的,第二条红线销毁的是先局部变量t4,然后形参,因为你的类没有一个operator=,所以调用的默认的 你的类里面加一个 Tdate& operator=(const Tdate& rh) { cout << "enter operator=" << endl; this->month = rh.month; this->year = rh.year; this->day = rh.day; return *this; } 你会发现fun结束后依次销毁了局部变量t4和Q之后,执行了operator= ,然后才销毁,那个返回值。
  • 打赏
  • 举报
回复
引用 5 楼 Byte Lin 的回复:
[quote=引用 4 楼 Byte Lin 的回复:]第一条红线: 问题关键在于Tdate fun(Tdate Q) 这个函数。传参用的类型是Tdata, 所以当实参传给形参时,相当于执行一次复制构造函数。如果形参类型改为Tdata& 就能避免这问题。 第二条红线: 这条红线以及之前的两行所执行的析构函数都发生在 Tdata fun(Tdata Q) 内部。函数内部变量占用的是栈,也就是LIFO:last in first out。所以形参所占用内存会被[销毁(该红线前两行),接着销毁t4(该红线上一行),最后返回函数值所占用内存被销毁(该红线)
关于第二条红线问题,前一半写对了,后面不小心写错了,请见谅:正确销毁顺序是 函数返回值->t4->形参。[/quote]如果按照“函数返回值->t4->形参”的顺序,那么它对应的年份不应该是2012->2012->2010吗?我一直没搞懂这个
schneeball 2020-08-02
  • 打赏
  • 举报
回复
引用 4 楼 Byte Lin 的回复:
第一条红线:
问题关键在于Tdate fun(Tdate Q) 这个函数。传参用的类型是Tdata, 所以当实参传给形参时,相当于执行一次复制构造函数。如果形参类型改为Tdata& 就能避免这问题。

第二条红线:
这条红线以及之前的两行所执行的析构函数都发生在 Tdata fun(Tdata Q) 内部。函数内部变量占用的是栈,也就是LIFO:last in first out。所以形参所占用内存会被[销毁(该红线前两行),接着销毁t4(该红线上一行),最后返回函数值所占用内存被销毁(该红线)



关于第二条红线问题,前一半写对了,后面不小心写错了,请见谅:正确销毁顺序是 函数返回值->t4->形参。
schneeball 2020-08-02
  • 打赏
  • 举报
回复
第一条红线:
问题关键在于Tdate fun(Tdate Q) 这个函数。传参用的类型是Tdata, 所以当实参传给形参时,相当于执行一次复制构造函数。如果形参类型改为Tdata& 就能避免这问题。

第二条红线:
这条红线以及之前的两行所执行的析构函数都发生在 Tdata fun(Tdata Q) 内部。函数内部变量占用的是栈,也就是LIFO:last in first out。所以形参所占用内存会被第一个销毁(该红线前两行),接着销毁t4(该红线上一行),最后返回函数值所占用内存被销毁(该红线)。
老歌且摇滚 2020-08-01
  • 打赏
  • 举报
回复
1、第一条线 Tdate t3(t1); //利用对象t1初始化新对象t3,系统自动调用复制构造函数 2、第二条线 return之后相当于执行了一次复制构造函数,fun的析构顺序为,析构Tdate t4(2012,1,24); 析构Tdate t3(此处Q = t3),然后是析构复制构造函数Tdate t4
宇来风满楼 2020-08-01
  • 打赏
  • 举报
回复
fun函数返回后赋值调用了复制构造函数吧
  • 打赏
  • 举报
回复
Tdate t3(t1); 不是对应的第一个复制构造函数吗

64,644

社区成员

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

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