Ben*_*ker 3 c++ compiler-construction constructor
我不是复制结构的粉丝.我写过太多次了
void MyFunc(MyClass val)
Run Code Online (Sandbox Code Playgroud)
代替
void MyFunc(const MyClass& val)
Run Code Online (Sandbox Code Playgroud)
并且不得不花费数小时调试在传递值克隆的析构函数中删除指针的bug,或者发现减速因为我每次调用MyFunc时都会复制MyClass的每个成员.
所以我不想允许复制构造函数.
我知道你可以在每个班级禁用它们
private:
MyClass(const MyClass&)
Run Code Online (Sandbox Code Playgroud)
但我不想在每一堂课上都这样做.
是否有编译器开关默认关闭复制结构?有没有理由我应该允许除内置类型和指针之外的任何内容的复制构造?(这些相同的问题也适用于复制作业)
And*_*owl 10
是否有编译器开关默认关闭复制结构?
不,我真的希望没有.幸运的是,据我所知,情况确实如此.
有没有理由我应该允许除内置类型和指针之外的任何内容的复制构造?
当然.例如,为类型赋予语义,并将类的不同实例视为同一个概念实体.在这种情况下,创建副本变得非常方便.
另一方面,如果你想拥有一个不可复制的类(有用例),你可以将copy-constructor声明为private(按照你自己的建议),或者在C++ 11中将它标记为已删除:
struct X
{
X(X const&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
关于你写的:
太多次了,我写了
void MyFunc(MyClass val)而不是void MyFunc(const MyClass& val)花了几个小时来调试bug
我知道你可能犯错误,但你必须向他们学习.你也可以编写一个普通的函数,foo()如下所示:
void foo(int x) { x++; }
Run Code Online (Sandbox Code Playgroud)
并且发誓数小时试图弄清楚为什么,当你将它作为参数传递给一个变量的值时3,调用返回后该变量的值不是4.哦,你忘了添加参考符号:
void foo(int& x) { x++; }
// ^
Run Code Online (Sandbox Code Playgroud)
现在这是一个需要编译器选项的原因,该选项会使默认值为pass-by-reference吗?并不是的.这将是改变语言规则的一种选择.
想象一下如果您的编译器真的有这样一个您想要的开关会发生,有一天您会将程序发送给不使用该开关的其他人:他们花多少小时调试它以找出问题所在?
我的建议是从经验中学习,并尝试使您的阅读和写作技能适应标准语言,而不是相反.