猿问

在C++11中,使用匿名类构造一个对象时会发生什么?

我遇到了一个关于C++中类构造的问题。我定义了一个类obj,这个类中有两个成员和各种构造函数,其中包括默认构造函数、拷贝构造函数和移动构造函数。每个构造函数的函数体中都会输出一个字符串,表示这个构造函数被执行了。下面是类的定义:
classobj{
public:
string*e;
string*n;
obj():e(newstring("123")),n(newstring("456")){//默认构造
cout<<"default"<}
obj(string*s1,string*s2):e(s1),n(s2){//非默认构造
cout<<"nondefault"<}
obj(obj*t):e(t->e),n(t->n){//用指针构造
cout<<"pointer"<};
obj(obj&t):e(t.e),n(t.n){//拷贝构造
cout<<"copy"<};
obj(constobj&t):e(t.e),n(t.n){//拷贝构造
cout<<"constcopy"<};
obj(obj&&t)noexcept:e(t.e),n(t.n){//移动构造
cout<<"move"<}
obj(constobj&&t)noexcept:e(t.e),n(t.n){//移动构造
cout<<"constmove"<}
~obj(){
deletee;
deleten;
}
};
然后我在主函数中构造了一个名为o3的obj对象,构造参数是一个匿名的obj对象,我想看看构造o3时会调用哪个构造函数。代码如下:
intmain(){
objo3(obj(newstring("qqq"),newstring("zzz")));//这属于什么构造???
cout<<*o3.e<return0;
}
为了防止编译器优化,我给g++指定了-o0选项。最后执行结果如下:
nondefaultqqq
根据程序的执行结果来看,匿名类构造时调用了类的第二个构造函数,而o3没有调用任何一个构造函数。但是程序最终打印出了o3的成员,说明o3被成功构造了。这令我百思不得其解,o3是如何被构造出来的,调用了哪个构造函数?
程序是用gcc7.4.0编译的,在ubuntu下执行。
米琪卡哇伊
浏览 504回答 2
2回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答