我正在阅读一些 C++ 源代码,并且了解了一些语法。
path& path::operator+=(string postPath)
我想知道这是否是实际的语法以及为什么 c++ 不使用已经存在的运算符+,而是将值应用于有问题的对象。
就像您想确保对象被正确删除一样。但析构函数应该处理所有这些。
-Edit1
我知道 a += b; 之间有区别和a+b;
我想知道为什么c++不只使用operator+和+=,而不是像operator+一样重新定义operator+=
-Edit2
我不确定它是否正确,但我想问的是为什么该语言不基于 + 推断 += 。
现在我意识到+=的其他用途。感谢大家 :)
-
可能存在效率问题;如果你的对象复制/分配的成本很高,a+=b
可能会节省您的临时构造、复制构造和分配,并允许您更好地利用目标对象中已有的资源。如果std::vector
had a +=
运算符来连接向量,直接实现它会更有效(您可以利用目标对象的额外容量并避免无用的分配),而不是创建一个临时和向量(“从头开始”)并分配它。
实际上,通常我实施+
按照+=
,通常它会产生更高效且更易于编写的代码;像这样:
T &operator+=(const T &r)
{
// say that T encapsulates an N-dimensional array
for(int i=0; i<N; ++i)
arr+=r.arr[i];
return *this;
}
T operator+(const T &r)
{
T ret(*this);
ret+=r;
return ret;
}
(尽管我同意有一种方法可以要求编译器合成+
/-
来自现有运营商;关系运算符也是如此)
您可能想要一个可以添加某些内容但不能复制/分配的对象。例如,对于我的一个玩具项目,我曾短暂考虑过使用重载的信号对象(例如 boost 或 Qt,或 .NET 事件/多播委托)+=
添加连接(Signal &operator+=(std::function<T...> fn)
),但我不想处理赋值/复制语义(恕我直言,信号没有意义);
归根结底,有一个普遍的想法:在 C++ 中,您可以重载(几乎)所有运算符,让它们做您想做的任何事情,而无需特殊的语义限制。你可以写一个operator+
发射火箭和operator+=
删除硬盘上的所有文件 - 由您负责,如果这对您的应用程序有意义,您可以自由地执行此操作,没有特殊限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)