自己写了个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)?