构造函数和析构函数之间的"unexpected"配对。为什么要这样工作?
"unexpected" pairing between constructor and destructor. Why should it work like that?
代码是我创建的一个测试,以了解确切的工作方式。行为有点出乎意料。如果您知道将显示多少次"创建"answers"已删除",我没有。问题是为什么这样做并且没有不同?
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对象传递到您定义的函数中时)。添加复制构造函数的定义显示相等的(默认 复制)构造函数和destructor调用:
#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
对象传递到功能中时,正在使用该默认实现,并在功能主体内构造本地副本。您看到的额外的驱动器呼叫来自这些副本。如果您定义自己的复制构造函数,则可以在调用消息时打印一条消息,并且总计现在按预期匹配。
相关文章:
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 为什么我的 std::ref 无法按预期工作?
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 有人能解释一下为什么下界是这样工作的吗C++的
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么stream::忽略未按预期工作
- 为什么 HeapFree() 不能正常工作?
- 为什么我在 AVR 中的中断无法正常工作?
- 为什么指针在对二维数组进行排序时无法正常工作?
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 为什么 sizeof(ar)/ sizeof(ar[0]) 在传递给函数时无法在向量上正常工作?
- 为什么它在不分配内存的情况下工作正常
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 为什么"std::is_function_v"不能按预期工作?
- if-else 语句仅按特定顺序工作,我不知道为什么
- 为什么我的 while 循环对于特定输入中断,而对于其他输入工作正常?
- 你能向我解释这段代码吗,为什么工作是 c++ 质数
- C++函数指针.它是如何工作的以及为什么工作
- Boost::Bind和虚函数重载:它们为什么工作?