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)?

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

你的代码

const Test Test::operator=(const Test& test)

返回的是

return Test();

这样的吗?

不好意思,我不会,但我也想上机试试

8次构造,8次析构,你再好好查下你自己的图片图片