假设我们有一个class ABC
:
1)以下初始化是否可行?如果是,那么具体步骤是什么:
ABC a( ABC() );
2)这两种形式的对象创造之间有什么区别(表现等)?
ABC a;
ABC b=ABC();
答案 0 :(得分:1)
ABC a( ABC() );
通过名称a
声明一个函数,该函数将类型指针的对象引用到函数,返回ABC
的对象并且不带参数。这里没有对象创建。
ABC a;
通过调用默认构造函数来创建ABC
类型的对象。
ABC b=ABC();
创建ABC
类型的临时对象,然后调用复制构造函数将此对象复制到b
。
需要注意的是,编译器可能会通过应用返回值优化来省略复制构造函数调用。
答案 1 :(得分:1)
1)如上所述,这是一个函数声明;你需要稍微改变它以获得你想要的行为:
ABC a((ABC()));
或
ABC a = ABC();
在这种情况下,编译器有两个选择:
a
; a
。在这两种情况下,必须有一个可访问的拷贝构造函数,即使它实际上没有使用过。
2)
ABC a;
这将使用默认构造函数创建a
。
ABC b = ABC();
这将与问题1中的相同;编译器是否要删除副本。
因此,如果编译器不执行特定的优化,并且复制默认初始化对象的代价很高,则第一种形式可能更有效。
答案 2 :(得分:-2)
1)首先创建一个ABC实例(内部实例,没有任何参数调用构造函数)并将此(临时!!!)实例传递给ABC的copy constructor。如果复制构造函数完成了它应该做的事情,这绝对没用。
2)声明一个名为a
的变量,并在同一时间使用不带参数的构造函数(default constructor)实例化它。两个版本ins 2)完全相同。