通过引用传递是正确的解决方案吗?

时间:2021-05-07 01:12:49

标签: c++ pointers

我有这样的类型:

#pragma once

#include <stdio.h>
#include <string>

struct Color {
    std::string value;
};

struct Shirt {
    std::string brand;
    Color color;
};

class Outfit {
public:
    Outfit(Shirt shirt):
        shirt(shirt) {}

private:
    Shirt shirt;
};

我之前查看了 this Stackoverflow 线程关于此主题。

让我解释一下我的想法,我希望这里的任何人都告诉我我是对还是错,或者是否有我没有考虑或误解的地方。

我目前的理解是我应该将参数作为常量引用传递。如果我按值传递,那么当我创建一个 Outfit 的实例时,例如,Shirt 将被复制。如果我理解正确,这可能是危险的。副本和原始 Outfit 将指向同一个 Shirt 实例。这种共享所有权模式很危险,因为我们不知道 Shirt 是否会被发布。

这种理解正确吗?还是我把它复杂化了?

1 个答案:

答案 0 :(得分:1)

<块引用>

副本和原始 Outfit 将指向同一个 Shirt 实例

不,这是错误的。副本与原件没有任何关系,除非它也包含指针。在这种情况下,指针仍将指向它们在复制之前引用的任何内容。然而,即使是指针本身也不相同。因此,执行任何可能影响指针的操作,例如递增 (pointer++) 都不会影响其他指针。

在任何一个

Outfit(Shirt shirt): shirt(shirt) {}

Outfit(const Shirt& shirt): shirt(shirt) {}

复制一份。

如何完成取决于您选择哪一个。我认为第二个选项是首选,因为只调用复制构造函数来复制 shirt 参数,但第一个将创建 copy 然后使用移动构造函数将副本“移动”到 shirt 字段中。