C++对复制构造对象的引用

use*_*088 2 c++ constructor reference

嘿,这是一个非常基本的问题,但我对此感到困惑.说我创建了一个对象

MyObject a.

它带有一个复制构造函数,所以我知道我可以这样做:

MyObject b(a); 但我可以这样做吗?

MyObject& b(a);

如果我这样做:

MyObject b = a;什么在b?道歉,如果这个问题太基础,不能打扰发布.

Jos*_*eld 7

这样做MyObject& b(a)有什么做的拷贝构造函数.它只是创建b了一个对象的引用a.什么都没有复制.将其b视为对象的别名a.从那时起,您可以使用ba等效地引用同一个对象.

MyObject b = a;将使用复制构造函数,就像那样MyObject b(a);.


初始化有两种形式:T x = a;称为复制初始化 ; T x(a)T x{a}称为直接初始化.

何时T是引用类型,使用哪种类型的初始化无关紧要.两者都有相同的效果.

何时T是类类型,我们有两种可能性:

  1. 如果初始化是直接初始化(MyClass b(a);),或者,如果它是复制初始化a从或相同类型为被衍生T(MyClass b = a;):一个适用的构造T被选择来构造对象.

    如您所见,您的两个示例都属于此类类型初始化程序.

  2. 如果初始化是任何其他形式的复制初始化,则将考虑任何用户定义的转换序列,然后进行直接初始化.用户定义的转换序列基本上是任何标准转换序列,其中抛出一个转换构造函数.

    如果c是的Foo类类型和发生转换,从构造FooMyClass,那么MyClass b = c;就等于MyClass b(MyClass(c));.

所以基本上,如果源和目标类型相同,则两种形式的初始化都是等效的.如果需要转换,则不需要.一个简单的例子就是:

#include <iostream>

struct Bar { };

struct Foo
{
  Foo(const Foo& f) { std::cout << "Copy" << std::endl; }
  Foo(const Bar& b) { std::cout << "Convert" << std::endl; }
};

int main(int argc, const char* argv[])
{
  Bar b;
  Foo f1(b);
  std::cout << "----" << std::endl;
  Foo f2 = b;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

此程序的输出(禁用了复制省略)是:

Convert
----
Convert
Copy
Run Code Online (Sandbox Code Playgroud)

当然,还有许多其他类型的初始化(列表初始化,字符数组,聚合等).