下面的代码是我创建的一个测试,用于理解事物的确切运作方式。这种行为有点出乎意料。如果你知道多少次" A创造了"和#34;删除"将会显示,我没有。 问题是为什么这样做并没有区别?
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);
}
答案 0 :(得分:4)
你错误地计算了构造函数的调用。除了默认构造函数之外,还有对复制构造函数的调用(将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 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
编译器将提供复制构造函数的默认实现(如果您没有自己定义),它会对成员字段执行简单的按位复制。将A
对象传递给函数时,正在使用该默认实现,在函数体中构造本地副本。您看到来自这些副本的额外析构函数调用。如果您定义了自己的复制构造函数,则可以在调用时打印消息,并且总计现在匹配,如预期的那样。