sha*_*oth 5 c++ operator-overloading operators
假设我有一个不支持成员复制的类,所以我不想保留编译器实现的复制构造函数和赋值运算符.我也不想实现这些因为
所以我想禁止他们.为此,我将声明它们为私有并且不提供任何实现:
class NonCopyable {
private:
NonCopyable( const NonCopyable& ); //not implemented anywhere
void operator=( const NonCopyable& ); //not implemented anywhere
};
Run Code Online (Sandbox Code Playgroud)
现在我可以为operator=()成员函数选择任何返回类型.我选择哪种返回类型是否重要?
不,返回类型无关紧要.†
C++标准不对您自己声明的复制赋值特殊成员函数的返回类型强加任何要求.它只是需要有一个operator=()是acccepts"的类型完全一个参数X,X&,const X&,volatile X&或const volatile X&".††因此,void operator=( const NonCopyable& );仍然是一个复制赋值运算符(用户声明的运算符,具体而言).
因为您实际上提供了自己的复制赋值运算符,所以它将抑制默认复制赋值运算符的生成.这将强制所有对NonCopyable复制赋值运算符的调用解析为您的,导致任何尝试使用复制赋值运算符都无法编译,因为它已声明private.
class Foo : NonCopyable
{
};
int main()
{
Foo a;
Foo b;
// Compiler complains about `operator=(const NonCopyable&)`
// not accessible or something like that.
a = b;
}
Run Code Online (Sandbox Code Playgroud)
而且由于我永远无法实际使用它,因此它并不完全是规范的复制赋值运算符.如果我尝试使用复制赋值运算符,则会导致编译器错误,这正是您想要的.
†当然,从风格上说,如果复制赋值操作符实际上做了某些事情,那就很重要了.通常,您希望操作符的行为与内置操作符一样,因此X&当您实际执行赋值时,返回a 是一种很好的做法.
†† C++标准:12.8复制类对象[class.copy]
9甲用户声明的拷贝赋值运算符
X::operator=是类的非静态的非模板成员函数X类型的正好一个参数X,X&,const X&,volatile X&或const volatile X&.
这一点很重要:
void确保类实现中的一小部分意外/误导调用 (a = b = c / f(d = e)) 产生编译时错误而不是链接时错误,这可以节省编译时间并且更易于理解(最小相关)对于许多开发人员接触过的大型类,其中一些开发人员事先熟悉程度有限)。
void会给我(也希望大多数开发人员)敲响警钟,想知道您是否:
operator=operator=。考虑到开放性问题,其他程序员不太可能认为您只是没有抽出时间提供实现并随意添加它(您可能觉得注释已经足够了)。
operator=可能会产生相反的效果 - 一切都在观看者的眼睛(和思想)中......| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |