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 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题