作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用两个类的union
,在这个简单的示例中,union
记住了最后一个存储在其中的类,并为该对象调用正确的析构函数:
#include <iostream>
using std::cout;
using std::endl;
struct yes{
yes(){cout<<"yes-c"<<endl;}
~yes(){cout<<"yes-d"<<endl;}
};
struct no{
no(){cout<<"no-c"<<endl;}
~no(){cout<<"no-d"<<endl;}
};
struct u{
union{
yes y;
no n;
};
u(yes _y):y(_y){}
u(no _n):n(_n){}
~u(){}
};
int main() {
yes y;
no n;
{
u uu(n);
}
return 0;
}
输出:
yes-c
no-c
no-d
no-d
yes-d
所以uu
会为union调用正确的析构函数~no()
,就好像它记录了构造union时的类型。这是如何运作的?
最佳答案
简短的回答:不是。
如果你给 no
添加一个拷贝构造函数你会看到实际上有三个 no
正在创建对象,但只有两个被破坏。
首先创建对象 n
.然后,当您将它按值 传递给 u
时构造函数,它被复制一次到 _n
争论。那_n
然后将对象复制到 uu.n
中成员(member)。
破坏属于_n
u
中的参数构造函数,以及 n
main
中的对象功能。
这是您的程序,稍作修改以添加复制构造函数并跟踪 no
对象:
#include <iostream>
struct yes{
yes(){std::cout<<"yes-c"<<std::endl;}
~yes(){std::cout<<"yes-d"<<std::endl;}
};
struct no{
no(){std::cout<<"no-c : "<<n<<std::endl;}
no(no const& o)
: n(o.n + 1)
{
std::cout << "no-cc : " << o.n << " -> " << n << '\n';
}
~no(){std::cout<<"no-d : "<<n<<std::endl;}
int n = 0;
};
struct u{
union{
yes y;
no n;
};
u(yes _y):y(_y){}
u(no _n):n(_n){}
~u(){}
};
int main()
{
yes y;
no n;
{
u uu(n);
}
}
如果没有优化或复制省略,这将创建输出
yes-cno-c : 0no-cc : 0 -> 1no-cc : 1 -> 2no-d : 1no-d : 0yes-d
输出 no-c : 0
用于创建 n
main
中的对象功能。
输出 no-cc : 0 -> 1
用于复制到 u
构造函数参数 _n
.
输出 no-cc : 1 -> 2
用于复制参数 _n
进入 union n
对象。
输出 no-d : 1
是_n
的破坏争论。
输出 no-d : 0
是n
的破坏main
中的对象功能。
关于c++ - C++ union 是如何知道其中存储的类型以及调用哪个析构函数的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54723339/
我是一名优秀的程序员,十分优秀!