我们可以像这样初始化一个C ++对象吗?

时间:2012-02-07 06:18:28

标签: c++ object initialization

  

可能重复:
  constructor invocation mechanism

假设我们有一个class ABC

1)以下初始化是否可行?如果是,那么具体步骤是什么:

 ABC a( ABC() );

2)这两种形式的对象创造之间有什么区别(表现等)?

ABC a;
ABC b=ABC();

3 个答案:

答案 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;
  • Elide 副本,并使用默认构造函数直接创建a

在这两种情况下,必须有一个可访问的拷贝构造函数,即使它实际上没有使用过。

2)

ABC a;

这将使用默认构造函数创建a

ABC b = ABC();

这将与问题1中的相同;编译器是否要删除副本。

因此,如果编译器不执行特定的优化,并且复制默认初始化对象的代价很​​高,则第一种形式可能更有效。

答案 2 :(得分:-2)

1)首先创建一个ABC实例(内部实例,没有任何参数调用构造函数)并将此(临时!!!)实例传递给ABC的copy constructor。如果复制构造函数完成了它应该做的事情,这绝对没用。

2)声明一个名为a的变量,并在同一时间使用不带参数的构造函数(default constructor)实例化它。两个版本ins 2)完全相同。