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