我有这样的类型:
#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 是否会被发布。
这种理解正确吗?还是我把它复杂化了?
答案 0 :(得分:1)
副本和原始 Outfit 将指向同一个 Shirt
实例
不,这是错误的。副本与原件没有任何关系,除非它也包含指针。在这种情况下,指针仍将指向它们在复制之前引用的任何内容。然而,即使是指针本身也不相同。因此,执行任何可能影响指针的操作,例如递增 (pointer++
) 都不会影响其他指针。
在任何一个
Outfit(Shirt shirt): shirt(shirt) {}
或
Outfit(const Shirt& shirt): shirt(shirt) {}
复制一份。
如何完成取决于您选择哪一个。我认为第二个选项是首选,因为只调用复制构造函数来复制 shirt
参数,但第一个将创建 copy 然后使用移动构造函数将副本“移动”到 shirt
字段中。