这是一个复制构造函数吗?

15 浏览
0 Comments

这是一个复制构造函数吗?

从技术角度来说,在创建b时是否应用了复制构造函数?

0
0 Comments

这段代码中出现的问题是关于复制构造函数的调用。原文中提到,一个复制构造函数接受一个相同类型的对象的引用作为参数。根据C++03的规定,复制构造函数的第一个参数应该是类型为X&或const X&的参数。

根据编辑后的内容,虽然调用了一个复制构造函数,但是它是A类的复制构造函数,而不是B类的复制构造函数。在原文中还提到,实际上并不一定需要调用复制构造函数。通过代码示例可以看出,当将一个A对象转换为一个B对象时,会先调用A的复制构造函数来构造B(A)的按值参数,然后再调用B的复制构造函数来从临时的B对象构造出b对象。

如果将B的构造函数改为B(A& a),那么a将直接绑定到B(A&)的引用参数上,而不会复制a,并且只会调用B的复制构造函数。

为什么会这样呢?因为这是规则。但是考虑一种情况,当从A到B的转换是通过A的转换运算符提供的,而不是B的转换构造函数提供的时候,就会出现这种情况。

以上是对原文中的内容进行整理和解释。关于这个问题的更多讨论可以在stackoverflow.com/questions/11222076/…上找到。

0
0 Comments

这段内容讨论了一个关于拷贝构造函数的问题,即在创建对象b时是否应用了拷贝构造函数。文章中提到,对象b的创建时调用了类A的拷贝构造函数,目的是将参数A a以传值方式传递给类B的构造函数。但是,创建对象b时并没有调用类B的拷贝构造函数。

文章还提到,如果使用"B b = a;"这种语法(称为复制初始化),可能需要创建B类型的临时值,此时会调用B的拷贝构造函数。然而,由于优化的原因,实际上这种情况下也会直接进行直接初始化。

此外,文章还提到了一些关于拷贝初始化和直接初始化的区别,以及使用拷贝初始化时要注意的问题。最后,提到了gcc的-fno-elide-constructors选项可以用来观察这种现象。

文章讨论了在对象创建过程中是否应用了拷贝构造函数的问题,并介绍了一些相关的知识和注意事项。

0
0 Comments

这段内容讨论了一个关于复制构造函数的问题。问题是:是否在下面的情况下会调用复制构造函数?

是的,在理论上。这是复制初始化。首先,从初始化器(a)构建一个临时B实例,然后通过复制构造函数将b从此临时实例初始化。

然而,编译器允许并经常省略临时实例和复制构造过程,直接使用B(A)构造函数从a构建b

这个问题的原因是,对于一个对象的初始化,使用等号(=)是否等同于相应的构造函数调用。然而,实际情况并非如此,这可能会导致一些意外结果。标准中关于这个问题的部分是§8.5 [dcl.init]的第16段。

因此,解决这个问题的方法是确保理解复制初始化和对象初始化的细节,并根据需要使用适当的构造函数来初始化对象。

0