use*_*088 2 c++ constructor reference
嘿,这是一个非常基本的问题,但我对此感到困惑.说我创建了一个对象
MyObject a.
它带有一个复制构造函数,所以我知道我可以这样做:
MyObject b(a);
但我可以这样做吗?
MyObject& b(a);
如果我这样做:
MyObject b = a;什么在b?道歉,如果这个问题太基础,不能打扰发布.
这样做MyObject& b(a)有什么做的拷贝构造函数.它只是创建b了一个对象的引用a.什么都没有复制.将其b视为对象的别名a.从那时起,您可以使用b和a等效地引用同一个对象.
MyObject b = a;将使用复制构造函数,就像那样MyObject b(a);.
初始化有两种形式:T x = a;称为复制初始化 ; T x(a)并T x{a}称为直接初始化.
何时T是引用类型,使用哪种类型的初始化无关紧要.两者都有相同的效果.
何时T是类类型,我们有两种可能性:
如果初始化是直接初始化(MyClass b(a);),或者,如果它是复制初始化与a从或相同类型为被衍生T(MyClass b = a;):一个适用的构造T被选择来构造对象.
如您所见,您的两个示例都属于此类类型初始化程序.
如果初始化是任何其他形式的复制初始化,则将考虑任何用户定义的转换序列,然后进行直接初始化.用户定义的转换序列基本上是任何标准转换序列,其中抛出一个转换构造函数.
如果c是的Foo类类型和发生转换,从构造Foo到MyClass,那么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)
当然,还有许多其他类型的初始化(列表初始化,字符数组,聚合等).
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |