enpersuen 2014-12-21 09:16 采纳率: 0%
浏览 1993

C++:test类中为什么创建了6个对象,却调用了7次析构函数

自己写了个Test类,原来是想验证在在下面这条语句中是不是先创建一个临时变量,然后再调用拷贝构造函数,

 Test t3 = test_func(t2);

程序共3个文件test.h test.cpp 和prac.cpp,分列如下:

// test.h
 class Test
{
public:
    Test();
    ~Test();
    Test(const Test &);
    const Test operator=(const Test &);
    friend  Test test_func(const Test );
    void say(void);
};
// test.cpp
#include <iostream>
#include "test.h"

Test::Test()
{
    std::cout << "default constructor called!\n";
}
Test::~Test()
{
    std::cout << "default destructor called!\n";
}
Test::Test(const Test &)
{
    std::cout << "Using copy constructor...\n";
}

const Test Test::operator=(const Test& test)
{
    std::cout << "Using default assignment overloaded\n";
}

Test test_func(const Test test)
{
    std::cout << "------------------------------\n";
    Test tst;
    std::cout << "------------------------------\n";
    return tst;
}

void Test::say(void)
{
    std::cout << "I'm here!\n";
}
// prac.cpp
#include "test.h"

int main(void)
{
    Test t1;
    Test t2;
    t1 = test_func(t2);
    Test t3 = test_func(t2);
    t3.say();
    return 0;
}

运行之后,出现了下面的情况

default constructor called!   // t1
default constructor called!   // t2
Using copy constructor...    // 第一次调用test_func函数参数传值
------------------------------
default constructor called!  // 第一次调用test_func函数中的局部变量
------------------------------
Using default assignment overloaded   // 使用test_func函数返回值给t1赋值
default destructor called!   // 第一次调用test_func函数参数释放
default destructor called!   // 第一次调用test_func函数局部变量释放
**default destructor called! **   // 这里的这个是哪个对象调用的呢?
Using copy constructor...   // 第二次调用test_func函数参数传值
------------------------------
default constructor called!// 第二次调用test_func函数中的局部变量
------------------------------
default destructor called! // 第二次调用test_func函数中参数释放
_// 这里不是该有一个第二个局部变量释放调用default desctructor 的语句打印吗吗?
// 这里不是该有一个t3 使用复制构造函数的语句打印吗?_
I'm here!                       // t3 调用say()
default destructor called! // t3 释放
default destructor called! // t2 释放
default destructor called! // t1 释放

现在弄不明白的是那多出的一个析构函数调用是哪里用到的?
还有在t3声明初始化为函数返回值时,用没用临时变量传值(从程序输出看,好像第二次局部变量再函数运行完之后没有释放,而是直接变身成了t3)?

  • 写回答

4条回答

  • threenewbee 2014-12-21 12:19
    关注

    const Test Test::operator=(const Test& test)
    {
    std::cout << "Using default assignment overloaded\n";
    }
    这里没有返回值,代码根本就没法编译。

    评论

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误