c++ - 你能关闭 C++ 中的默认复制构造函数吗?

标签 c++ compiler-construction constructor

我不喜欢复制构造。写了太多次了

void MyFunc(MyClass val)

代替

void MyFunc(const MyClass& val)

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

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

我知道你可以在每个类(class)的基础上禁止他们

private:
    MyClass(const MyClass&)

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

是否有编译器开关默认关闭复制构造?除了内置类型和指针之外,我是否应该允许复制构造? (这些相同的问题也适用于复制作业)

最佳答案

Is there a compiler switch to turn off copy construction by default?

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

Is there a reason I should allow copy construction on anything other than built-in types and pointers?

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

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

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

关于你写的内容:

Too many times, I've written void MyFunc(MyClass val) instead of void MyFunc(const MyClass& val) and had to spend hours debugging bugs

我知道你可能会犯错,但你必须从中吸取教训。你也可以写一个普通的函数,比如下面的 foo():

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

发誓数小时试图找出原因,当您将其作为参数传递给一个值为 3 的变量时,调用返回后该变量的值不是 4。哦,你忘了添加引用符号:

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

现在这是否是需要一个编译器选项的原因,该选项将使按引用传递成为默认值?并不真地。这将是更改语言规则的一个选项。

想象一下,如果您的编译器真的有这样一个您希望的开关,并且有一天您将您的程序发送给没有使用该开关的其他人,将会发生什么:他们花时间调试它以找出问题所在?

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

关于c++ - 你能关闭 C++ 中的默认复制构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15327124/

相关文章:

c++ - 基于不同枚举值的类成员重载(或特化)

c++ - 直线下的二维点

c++ - 如何在cmake中使用宏?

c++ - C++程序的编译阶段是什么?

delphi - 关于delphi中调用静态类的不同方式

c++ - 设计对象层次结构的正确方法

c# - 忽略特定子文件夹的 C# 编译警告?

linux - 编译/链接 CUDA 和 CPP 源文件

C++构造函数初始化引用赋值

Java:为什么反序列化不调用构造函数以及最好的解决方法是什么?