3

我不喜欢复制结构。写了很多遍

void MyFunc(MyClass val)

代替

void MyFunc(const MyClass& val)

并且不得不花费数小时调试已在按值传递克隆的析构函数中删除的指针周围的错误,或者发现减速,因为我每次调用 MyFunc 时都在复制 MyClass 的每个成员。

所以我不想允许复制构造函数。

我知道你可以按班级禁止他们

private:
    MyClass(const MyClass&)

但我不想在每一堂课上都这样做。

是否有编译器开关默认关闭复制构造?我是否有理由允许对内置类型和指针以外的任何内容进行复制构造?(同样的问题也适用于复制作业)

4

3 回答 3

10

是否有编译器开关默认关闭复制构造?

,我真的希望没有。幸运的是,据我所知,情况确实如此。

我是否有理由允许对内置类型和指针以外的任何内容进行复制构造?

当然。例如,为您的类型提供值语义并将您的类的不同实例视为相同的概念实体。在这种情况下,创建副本是一件非常方便的事情。

另一方面,如果您想要一个不可复制的类(有此用例),您可以将复制构造函数声明为private(如您自己建议的那样),或者在 C++11 中,将其标记为已删除

struct X
{
    X(X const&) = delete;
};

关于你写的:

太多次,我已经写void MyFunc(MyClass val)而不是void MyFunc(const MyClass& val)并且不得不花费数小时调试错误

我知道你可能会犯错误,但你必须从中吸取教训。您还可以编写一个普通函数,foo()如下所示:

void foo(int x) { x++; }

并且发誓要弄清楚为什么,当你将它作为参数传递一个3值为 的变量时,调用返回后该变量的值不是4。哦,你忘了添加参考符号:

void foo(int& x) { x++; }
//          ^

现在这是需要一个编译器选项的原因吗?它可以使传递引用成为默认值?并不真地。这将是改变语言规则的一种选择。

想象一下,如果你的编译器真的有这样一个你想要的开关,有一天你会把你的程序发送给没有使用那个开关的其他人:他们会花多少小时调试它来找出问题所在?

我的建议是从经验中学习并尝试使您的阅读和写作技能适应标准语言,而不是相反。

于 2013-03-10T20:26:15.313 回答
1

没有神奇的开关。你只是犯了编程错误并希望改变语言。如果您在堆上分配内存,则必须(或至少应该)覆盖默认的复制构造函数并处理该动态内存。或者,您可以使用一些现成的类,例如 std::vector 或std::auto_ptrstd::unique_ptr在 C++11 中)。

于 2013-03-10T20:25:13.437 回答
-1

What I do is declare the copy ctor in the class but never define it anywhere. If I write code that uses the copy ctor, then I get an undefined symbol from the linker.

于 2013-03-10T20:34:16.787 回答