繁体   English   中英

为什么应在C ++中通过引用传递赋值运算符的参数?

[英]why should the parameter of assignment operator be passed by reference in C++?

我读了C ++入门5。 我看到当我们在使用复制和交换的赋值运算符中使用非引用参数时是可以的,但是在其他赋值运算符中,我们总是使用引用参数并复制右手操作数,然后销毁左手操作数以确保如果将对象分配给自身,赋值运算符将正常工作。 为什么不在以后将在函数体中复制的赋值运算符中使用非引用参数,以便我们不必在函数体中复制右侧操作数?

复制赋值运算符通常应按值(而不是引用)获取其参数,以便使用按值参数作为副本进行复制和交换。

如果您不执行(只是)复制和交换,则您的复制分配操作员应该通过引用获取其参数。 至于为什么不进行复制和交换:可能是由于对该类型进行了一些特定的优化。 例如,考虑一个普通可复制类型的std::array (为了避免谈论异常安全的麻烦,这很简单)。 最有效的分配方法是直接复制字节:您不需要对象的临时副本,当然也不需要交换。 因此,在实践中,您可以通过引用获取参数,编写std::copy ,并期望编译器以最佳方式进行操作。

有时即使在进行复制和交换的情况下,在教科书中也可以看到复制分配运算符中的特殊情况下的自我分配,但在C ++ 03中通常是个坏主意。 尽管按引用参数优化了自赋值的情况,但从临时参数取消优化了赋值的情况。 在C ++ 11中,它的坏处不那么明显,因为可以通过移动分配运算符而不是复制分配运算符来处理临时赋值的情况。 但这仍然是不必要的。 自赋值在实际代码中很少见,因此甚至可以发现,在常见情况下,指针比较比在罕见情况下的复制要多得多的运行时间。

我尚未阅读《 C ++ Primer》的第五版,并且您选择不显示您所要求的代码,因此我无法评论其中给出赋值运算符的特定情况(复制赋值或否则)通过引用获取参数。

抱歉,但总的来说,我认为从统计上来说,您比这本书更容易使您感到困惑;-)您说:

...在使用复制和交换的赋值运算符中,但在其他赋值运算符中

好的,所以“其他赋值运算符”是使用复制和交换的赋值运算符吗?

我们总是使用参考参数并在销毁左手操作数之前复制右手操作数

如果复制右侧操作数,则表示正在进行复制和交换。 或至少与您非常接近,因为制作完副本后,除了交换以外,几乎没有什么用其他任何方法将副本放到左侧。 无论哪种方式,如果函数要做的第一件事是复制按引用参数,那么它应该已经按值采用了该参数。

确保将赋值运算符正确分配给对象

如果确保自赋值正确工作的技术是始终复制右侧操作数,则应按值采用参数。 不需要什么了。 但是,还有其他技术可以确保自指派工作。 您未显示的代码中可能发生了其中一种情况。

主要原因是效率。 对于小类/结构,这可能无关紧要,但是,如果它是一个大型复杂类,那就是另一回事了。 如果您按值传递,则将调用潜在的大型复杂复制操作。 这可能需要大量的内存分配。

真正的答案是有时并不重要。 通常这确实很重要,因此最好的方法是始终使用引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM