【问题标题】:Copy constructor or assignment operator or both, which is called here? [duplicate]复制构造函数或赋值运算符或两者都在这里调用? [复制]
【发布时间】:2013-03-07 18:31:50
【问题描述】:

考虑以下语句:-

Class A a = b;//Where is b is existing object of class A.

A 类同时具有复制构造函数和赋值运算符重载(实现)。所以在这种情况下,将调用上述语句、复制构造函数或赋值运算符或两者?

【问题讨论】:

    标签: c++


    【解决方案1】:

    这称为 Copy initialization

    复制初始化定义为:

    T t2 = t1;
    

    根据t1类型,可能有两种情况:

    如果t1 不属于类型 T

    • 它尝试使用隐式转换序列将t1 转换为类型 T
    • 然后通过调用复制构造函数将创建的对象复制到t2

    如果t1 属于类型 T

    • 它通过调用复制构造函数将t1 复制到t2

    请注意,复制构造函数调用可能通过 copy elision省略


    这里不涉及分配。仅当您将已构造的对象分配给另一个时,才会发生分配。您的代码语句在一个语句中涉及构造和赋值,因此本身没有赋值。

    【讨论】:

    • 你认为A类的临时对象为什么会在这里创建呢?如 cmets 中所述,b 已经是 class A 的对象。如果 b 不是class A 的对象,AFAIK 将创建临时对象。在我看来,我们有“直接初始化”的情况......
    • 为什么在复制构造函数参数为const对象引用的情况下会创建临时对象?
    • 不,没有副本。 bA 类型,因此在这种情况下,效果被定义为与直接初始化完全相同
    • @PiotrNycz 你是对的,没有临时的。 A a=b;和这里的A a(b);是一样的,不过还是叫拷贝初始化。
    • @juanchopanza 你是 100% 正确的:没有临时但仍然复制初始化。我浏览链接的文章太快了,想保留这篇文章的命名。我的错。
    【解决方案2】:

    在这种情况下,复制构造函数被调用。因为“A 类”类对象“a”是复制已构造的“A 类”对象 b 的值而构造的。

    不可能调用作用于两个已创建对象的赋值运算符。

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 1970-01-01
      • 2011-02-08
      • 2013-06-09
      • 2017-09-03
      • 2011-09-05
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多