c++ - 复制构造函数调用了 2 次,而不是预期的 3 次?

标签 c++ constructor copy-constructor

这是从一本介绍复制构造函数的教科书中摘录的程序:

#include <stdio.h>
#include <conio.h>
#include <iostream>

using namespace std;

class point
{
    private:
        int x,y;
    public:
        point(int ox =0, int oy =0)
        {
            cout << " Make object" << this << endl;
            cout << " Using default constructor \n";
            x = ox, y = oy;
        }
        point(const point &p)
        {
            cout << " Make object" << this << endl;
            cout << " Using copy constructor \n";
            x = p.x, y = p.y;
        }
        void move(int dx, int dy);
        void display();
};

point fct(point a);

int main()
{
    point a(5,2);
    a.display();

    point b = fct (a);
    b.display();
    getch();
    return 0;
}

void point::move(int dx, int dy)
{
    x += dx, y += dy;
}

void point::display()
{
    cout << "Coordinates :" << x << " " << y << "\n";
}

point fct(point a)
{
    point b=a;
    //b.move(2,3);
    return b;
}

需要注意的是,复制构造函数的形式是:point(const point &p) 而不是point(point &p)(后者是教科书上的,但无法编译,所以我不得不切换到第一个,但我仍然不明白为什么 :( )

课本上说会有3行“Using copy constructor”,对应3次调用copy constructor。我认为这样做的原因是,当你打电话时: b = fct(a)

  1. 函数“fct”复制了一个(按值传递),因此一次调用

  2. 行:点 b = a:再次调用复制构造函数

  3. 然后将返回值复制到 b(main 中的变量,而不是 fct 中的变量)这是第三个。

但是在执行时,只有 2 个调用。谁能给我一个很好的解释?

最佳答案

出现两个拷贝是因为命名返回值优化 (NRVO) 省略了其中一个拷贝。

point fct(point a)
{
    point b=a;
    return b;
}

point b = fct (a);

第一个拷贝是从main中的参数afct中的参数a。发生这种情况是因为 point 是按值获取的。

第二个拷贝是在func中从ab

被省略的拷贝是按值返回b 的拷贝。在这种情况下,b 可以直接分配到调用站点的 b 中,因此不会发生复制。

关于c++ - 复制构造函数调用了 2 次,而不是预期的 3 次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31069255/

相关文章:

c++ - 复制构造函数不被继承

c++ - 在 2D std::vector 中移动行/列的最有效方法

C++ 将枚举传递给对象构造函数

c++ - 深层复制构造函数 - 类 C++ 中的动态数组无效的 free()/delete/delete[]/realloc()

c++ - 如果基类构造函数受到保护,为什么我们不能在派生类函数中创建基类的对象

java - 如何在不调用构造函数的情况下从另一个类获取变量?

c++ - 使用 "new"调用复制构造函数

c++ - 从内存中提取 double 的字节值

c++ - 帮助使用 OSSpinLock* 替换 while(true) {sleep(1);}

c++ - 如何在 C++ 中从剪贴板复制/粘贴?