C++ &引用;“意外”;构造函数和析构函数之间的配对。为什么要这样工作?
下面的代码是我创建的一个测试,目的是了解事情到底是如何工作的。这种行为有点出乎意料。如果你知道“已创建”和“已删除”将显示多少次,我没有。 问题是为什么这样做,而不是有什么不同C++ &引用;“意外”;构造函数和析构函数之间的配对。为什么要这样工作?,c++,C++,下面的代码是我创建的一个测试,目的是了解事情到底是如何工作的。这种行为有点出乎意料。如果你知道“已创建”和“已删除”将显示多少次,我没有。 问题是为什么这样做,而不是有什么不同 struct A{ int a=0x10; A(){std::cout<<"A created"<<std::endl;} ~A(){std::cout<<"A deleted"<<std::endl;} }; void test0(A a1,A
struct A{
int a=0x10;
A(){std::cout<<"A created"<<std::endl;}
~A(){std::cout<<"A deleted"<<std::endl;}
};
void test0(A a1,A a2){
std::cout<<"test0"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl;
}
void test1(const A a1,const A a2){
std::cout<<"test1"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl;
}
int main(int argc, char **argv)
{
A a,b;
test0(a,b);
test1(a,b);
}
结构A{
INTA=0x10;
A(){std::cout您对构造函数调用计数错误。除了默认构造函数外,还有对复制构造函数的调用(当将A对象传递到您定义的函数中时)。添加复制构造函数的定义将显示相等数量的(默认+复制)构造函数和析构函数调用:
#include <iostream>
struct A{
int a=0x10;
A(){std::cout<<"A created"<<std::endl;}
A(const A&) { std::cout << "A copied" << std::endl; } // Copy constructor!
~A(){std::cout<<"A deleted"<<std::endl;}
};
void test0(A a1,A a2){
std::cout<<"test0"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl;
}
void test1(const A a1,const A a2){
std::cout<<"test1"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl;
}
int main()
{
A a,b;
test0(a,b);
test1(a,b);
}
编译器将提供复制构造函数的默认实现(如果您自己没有定义),它对成员字段进行简单的按位复制。当您将
a
对象传递到函数中,在函数体中构造本地副本时,使用了该默认实现。您看到的其他析构函数调用来自这些副本。如果您定义了自己的副本构造函数,则可以打印混乱调用时的年龄和总数现在与预期相符。我不明白你在问什么。你的预期行为和实际行为是什么?你需要添加准确的预期行为和观察到的行为。有时调用复制构造函数而不是A()你没有计算对拷贝构造函数的调用。如果C++做了一个,但是你期望的B,没有必要问我们为什么A发生了,而不告诉我们B应该是什么。我们显然会站在实际发生的一边,不知道你的个人期望是什么。告诉我们!
A created
A created
A copied
A copied
test0 a1=16 a2=16
A deleted
A deleted
A copied
A copied
test1 a1=16 a2=16
A deleted
A deleted
A deleted
A deleted