gpt4 book ai didi

c++ - 在 C++ 中,如果复制一个对象是可能的,但确实很昂贵而且通常不是一个好主意,您是否仍然应该使用复制构造函数来实现复制?

转载 作者:可可西里 更新时间:2023-11-01 18:23:20 25 4
gpt4 key购买 nike

我是 C++ 的新手,我对一些关于复制的 C++ 约定有疑问。我在谷歌上四处搜索,并没有真正找到好的指导,所以我求助于你们这些好人。

假设您有一个对象,代表某种技术上可复制的资源,但复制成本很高,而且几乎总是错误的做法。你还应该为它实现一个复制构造函数吗?还是创建一个类似 make_copy() 的成员函数更好(对于那些您确实想要复制对象的罕见情况)。

例如:假设您有一个表示存储在显存中的纹理的类。该资源在技术上是可复制的:您可以为其创建一个新句柄并复制内存(通过 CPU 或使用图形库调用)。但一般来说,这不是你真正想经常做的事情。它很昂贵,而且通常是错误的做法,并且可能非常浪费内存。但是,您可以想象有意义的极端情况:截取屏幕截图并在其上应用过滤器或其他东西。这些情况很少见,但它们会存在。

我之所以犹豫要不要制作一个复制构造函数来执行此操作,是因为我觉得 C++ 有点太急于复制东西了。也许它反射(reflect)了​​我对这门语言有点陌生的事实,但由于 C++ 会在各种情况下调用复制构造函数,而您可能并不打算这样做。喜欢:

void some_method(Texture t)
{
...
}

Texture t(<arguments>);
Texture t2 = t; // calls copy constructor

some_method(t2); // calls copy constructor

我宁愿调用复制构造函数的这两行是编译器错误(因为我觉得它们很容易犯错误),如果你想真正制作一个拷贝,你需要非常明确地说明它并且使用专用的成员函数。

关于这个有一些标准的做法吗?关于何时应该(和不应该)编写复制构造函数的一些明智建议?我错过了一些 Scott Meyers 的章节?还是只要有可能我就应该这样做?

编辑:为了清楚说明我的示例:显然,您应该通过引用传递参数,但我的观点是这是一个很容易犯的错误,只是漏掉了 & 符号。如果你这样做,编译器会很乐意用非常昂贵的拷贝替换便宜的按引用传递,我宁愿编译器不这样做。但我不知道,也许这不是人们通常在 C++ 中犯的错误,我过于谨慎了?

最佳答案

是否要使用它是您的决定,但这里有一个语法相对简单的模式:

struct ExplicitCopy {

// Implement as usual
ExplicitCopy() = default;
ExplicitCopy(ExplicitCopy &&) = default;
ExplicitCopy &operator = (ExplicitCopy &&) = default;

// Copying happens with an ADL call to this function
friend ExplicitCopy copy(ExplicitCopy const &orig) {
return orig;
}

private:
// Copy operations are private and can't be called accidentally
ExplicitCopy(ExplicitCopy const &) = default;
ExplicitCopy &operator = (ExplicitCopy const &) = default;
};

然后,尝试复制实例将导致调用私有(private)构造函数时出现编译器错误。

ExplicitCopy ec;
ExplicitCopy ec2 = ec; // Nope
ExplicitCopy ec3(ec); // Nope
ExplicitCopy ec4 = copy(ec); // Yes

由于复制省略,没有额外的构造函数调用。

See it live on Coliru

关于c++ - 在 C++ 中,如果复制一个对象是可能的,但确实很昂贵而且通常不是一个好主意,您是否仍然应该使用复制构造函数来实现复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53170207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com