热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请大神帮忙看下这个程序

#include<iostream>#include<stack>usingnamespacestd;classA{public:A(intelem
#include 
#include 
using namespace std;

class A
{
public:
A(int element)
{
a = element;
cout<<"construct"< }
~A()
{
cout<<"end"< }
void print()
{
cout< }
private:
int a;
};

int main()
{
A a1(1),a2(2);
stack stack1;
stack1.push(a1);
stack1.push(a2);
A &data = stack1.top();
stack1.pop();
data.print();
return 0;
}


有两个问题:
1、构造两个对象,构造函数调用2次,析构函数为什么会调用4次呢?
2、stack1.pop()后,a2对象被析构了,那为什么它的引用data还能够调用成员函数print()呢?析构后对象内存不应该释放才对嘛?
本人c++新手,还请大神们帮忙解答一下,谢谢!

10 个解决方案

#1


1. 有两个对象是通过调用A类的复制构造函数生成的。

2. 
a、 此时a2还没有析构,它的作用域是main函数,在main函数结束时才会调用它的析构函数
b、 push 操作会复制对象,引用的并不是a2,而是stack中复制生成的副本

#2


引用 1 楼 mougaidong 的回复:
1. 有两个对象是通过调用A类的复制构造函数生成的。

2. 
a、 此时a2还没有析构,它的作用域是main函数,在main函数结束时才会调用它的析构函数
b、 push 操作会复制对象,引用的并不是a2,而是stack中复制生成的副本

恩,感谢您的回复,也就是说push时调用了类A的复制构造函数,其push只是原对象的一个副本。
不过还有个问题,data引用的是a2的副本,暂且叫它a2_temp,那pop()之后a2_temp会被析构才对,那为什么data.print()还能够执行呢

#3


push的时候传的是引用,没有发生复制啊,奇怪了

#4


http://bbs.csdn.net/topics/390472811

引用 2 楼 xc889078 的回复:
Quote: 引用 1 楼 mougaidong 的回复:

1. 有两个对象是通过调用A类的复制构造函数生成的。

2. 
a、 此时a2还没有析构,它的作用域是main函数,在main函数结束时才会调用它的析构函数
b、 push 操作会复制对象,引用的并不是a2,而是stack中复制生成的副本

恩,感谢您的回复,也就是说push时调用了类A的复制构造函数,其push只是原对象的一个副本。
不过还有个问题,data引用的是a2的副本,暂且叫它a2_temp,那pop()之后a2_temp会被析构才对,那为什么data.print()还能够执行呢

#5


传的是引用不假,但是,你有看过push的实现吗?

引用 3 楼 henry3695 的回复:
push的时候传的是引用,没有发生复制啊,奇怪了

#7


1、两个push其实是构造了两个对象
2、pop后可以访问是因为,对象析构后,只是告诉系统此对象已经无效了,但是数据的内存值还在 的,等到下次用到这块内存的时候,直接把这块内存使用了,这样做貌似好偷懒,其实是提高了效率,少了一次内存操作,只是个人推测

#8



A test(A TT)
{
TT.print();
return TT;
}


在加点,看看调用这个要做几次拷贝

#9


引用 8 楼 henry3695 的回复:

A test(A TT)
{
TT.print();
return TT;
}


在加点,看看调用这个要做几次拷贝

这应该是调用两次复制拷贝,一次是形参值传递那里,另一次是return那里,所以会执行两次复制拷贝函数和两次析构函数

#10


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

推荐阅读
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
author-avatar
Pri_颖颖_773
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有