为什么同一个 class 对象的构造函数和析构函数被隐式调用多次
why the constructor and destructor of the same class object are implicitly called multiple times
英语不是我的母语,所以请原谅我的语法问题。
当我运行我的程序时,我发现在定义对象和显式调用构造函数时会调用class构造函数。在调用构造函数和离开作用域后,析构函数被调用了两次。
#include<iostream>
class test {
private:
int a;
int b;
int c;
public:
test(int first = 0, int second = 0, int third=0 );
void show();
~test();
};
void test::show() {
std::cout << this->a<<"\n";
}
test::test(int first , int second , int third ) {
this->a = first;
this->b = second;
this->c = third;
std::cout << "Construct\n";
}
test::~test() { std::cout << "destruct\n"; }
extern test myclassone;
#include <iostream>
#include "myhead.h"
test myclassone;
int main()
{
std::cout << "begain\n";
{
std::cout << "mid\n";
myclassone = test(1,1,1);
std::cout << "mid\n";
myclassone.show();
}
std::cout << "end\n";
}
这个程序的输出是
Construct
begain
mid
Construct
destruct
mid
1
end
destruct
在我的期望中,构造函数和析构函数只会被调用一次。但令人费解的是,根据输出结果,它们被调用了两次。
这个问题我google了一下,很多答案都没有解释为什么在定义对象的时候调用构造函数,为什么在调用构造函数后马上调用析构函数
你的程序运行如下:
- 为全局对象调用了构造函数
test myclassone;
。
main()
被调用。
打印 begain
和 mid
。
- 为时间对象调用构造函数
test(1,1,1)
。
- 临时对象已分配给全局对象。
- 为临时对象调用析构函数
test(1,1,1)
。
mid
被打印出来。
myclassone.show()
被调用。
end
被打印出来。
- Return 来自
main()
.
- 为全局对象调用了析构函数
test myclassone;
因此每个对象调用一次构造函数和析构函数,总共调用两次。
英语不是我的母语,所以请原谅我的语法问题。
当我运行我的程序时,我发现在定义对象和显式调用构造函数时会调用class构造函数。在调用构造函数和离开作用域后,析构函数被调用了两次。
#include<iostream>
class test {
private:
int a;
int b;
int c;
public:
test(int first = 0, int second = 0, int third=0 );
void show();
~test();
};
void test::show() {
std::cout << this->a<<"\n";
}
test::test(int first , int second , int third ) {
this->a = first;
this->b = second;
this->c = third;
std::cout << "Construct\n";
}
test::~test() { std::cout << "destruct\n"; }
extern test myclassone;
#include <iostream>
#include "myhead.h"
test myclassone;
int main()
{
std::cout << "begain\n";
{
std::cout << "mid\n";
myclassone = test(1,1,1);
std::cout << "mid\n";
myclassone.show();
}
std::cout << "end\n";
}
这个程序的输出是
Construct
begain
mid
Construct
destruct
mid
1
end
destruct
在我的期望中,构造函数和析构函数只会被调用一次。但令人费解的是,根据输出结果,它们被调用了两次。 这个问题我google了一下,很多答案都没有解释为什么在定义对象的时候调用构造函数,为什么在调用构造函数后马上调用析构函数
你的程序运行如下:
- 为全局对象调用了构造函数
test myclassone;
。 main()
被调用。
打印 begain
和mid
。- 为时间对象调用构造函数
test(1,1,1)
。 - 临时对象已分配给全局对象。
- 为临时对象调用析构函数
test(1,1,1)
。 mid
被打印出来。myclassone.show()
被调用。end
被打印出来。- Return 来自
main()
. - 为全局对象调用了析构函数
test myclassone;
因此每个对象调用一次构造函数和析构函数,总共调用两次。