Questions tagged «operator-overloading»

运算符重载是一种编程语言的功能,它允许根据所涉及的操作数的类型为运算符自定义实现。某些语言允许定义新的运算符,而其他语言仅允许重新定义现有运算符。

7
运算符重载的基本规则和惯用法是什么?
注意:答案是按照特定顺序给出的,但是由于许多用户是根据投票而不是给出时间来对答案进行排序的,因此以下是最有意义的顺序的索引: C ++中运算符重载的通用语法 C ++中运算符重载的三个基本规则 会员与非会员之间的决定 普通运算符重载 赋值运算符 输入和输出运算符 函数调用运算符 比较运算符 算术运算符 数组下标 指针类型的运算符 转换运算符 重载新的和删除的 (注意:这本来是Stack Overflow的C ++ FAQ的一个条目。如果您想批评以这种形式提供FAQ的想法,那么开始所有这些工作的meta上的发布将是这样做的地方。该问题在C ++聊天室中进行监控,该问题最初是从FAQ想法开始的,所以提出这个想法的人很可能会读懂您的答案。)

16
Java为什么不提供运算符重载?
从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载? 没有Complex a, b, c; a = b + c;比这简单Complex a, b, c; a = b.add(c);吗? 是否存在已知的原因,有效的论据,不使运算符重载?原因是任意的,还是迷失了时间?

10
漂亮的C ++ STL容器
请注意这篇文章末尾的更新。 更新:我已经在GitHub上为此库创建了一个公共项目! 我希望有一个模板,该模板一劳永逸地负责通过漂亮地打印所有STL容器operator<<。用伪代码,我正在寻找这样的东西: template<container C, class T, String delim = ", ", String open = "[", String close = "]"> std::ostream & operator<<(std::ostream & o, const C<T> & x) { o << open; // for (typename C::const_iterator i = x.begin(); i != x.end(); i++) /* Old-school */ for (auto i …

15
==和!=是否相互依赖?
我正在学习C ++中的运算符重载,我看到了==,!=它们只是一些可以针对用户定义的类型进行自定义的特殊功能。但是,我担心的是,为什么需要两个单独的定义?我认为如果a == b为true,则a != b自动为false,反之亦然,并且没有其他可能性,因为根据定义,a != b为!(a == b)。而且我无法想象任何情况都不是真的。但是也许我的想象力有限,或者我什么都不知道? 我知道我可以用另一个来定义,但这不是我要问的。我也没有问比较按值或按身份比较对象之间的区别。或者两个对象是否可以同时相等和不相等(这绝对不是选择!这些东西是互斥的)。我要问的是: 是否有可能问到关于两个对象相等的问题是有意义的,而问他们不相等是没有意义的呢?(从用户角度或从实施者角度) 如果没有这种可能性,那么为什么在地球上C ++会将这两个运算符定义为两个不同的函数?

8
如何在C#中重载方括号运算符?
例如,使用DataGridView,您可以执行以下操作: DataGridView dgv = ...; DataGridViewCell cell = dgv[1,5]; 但是对于我来说,我找不到索引/方括号运算符的文档。他们怎么称呼它?在哪里实施?能扔吗?我如何在自己的课堂上做同样的事情? ETA:感谢您提供所有快速解答。简要地说:相关文档在“项目”属性下;重载的方法是通过声明一个类似的属性public object this[int x, int y]{ get{...}; set{...} }; 至少根据文档,DataGridView的索引器不会抛出。它没有提到如果您提供无效的坐标会发生什么。 再次ETA:好的,即使文档中没有提及它(顽皮的Microsoft!),事实证明,如果为DataGridView的索引器提供了无效的坐标,则实际上它会抛出ArgumentOutOfRangeException。公平警告。

5
如何正确重载ostream <<操作符?
我正在用C ++写一个小的矩阵库,用于矩阵运算。但是我的编译器抱怨,以前没有。这段代码在架子上放置了6个月,在此之间,我将计算机从debian etch升级到lenny(g ++(Debian 4.3.2-1.1)4.3.2),但是在具有相同g ++的Ubuntu系统上,我遇到了同样的问题。 这是我的矩阵类的相关部分: namespace Math { class Matrix { public: [...] friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; stream, const Matrix&amp; matrix); } } 和“实现”: using namespace Math; std::ostream&amp; Matrix::operator &lt;&lt;(std::ostream&amp; stream, const Matrix&amp; matrix) { [...] } 这是编译器给出的错误: matrix.cpp:459:错误:'std :: ostream&Math :: Matrix :: operator &lt;&lt;(std :: ostream&,const …




6
使用C#扩展方法重载运算符
我正在尝试使用扩展方法将操作员重载添加到C#StringBuilder类。具体来说,StringBuilder sb我想sb += "text"等同于sb.Append("text")。 这是为创建扩展方法的语法StringBuilder: public static class sbExtensions { public static StringBuilder blah(this StringBuilder sb) { return sb; } } 成功将blah扩展方法添加到中StringBuilder。 不幸的是,操作符重载似乎不起作用: public static class sbExtensions { public static StringBuilder operator +(this StringBuilder sb, string s) { return sb.Append(s); } } 除其他问题外,this此上下文中不允许使用关键字。 通过扩展方法可以添加运算符重载吗?如果是这样,解决该问题的正确方法是什么?

5
当operator&重载时,如何可靠地获取对象的地址?
考虑以下程序: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&amp;() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &amp;clyde; // darn; that's not clyde's address :'( } 我如何获得clyde的地址? 我正在寻找一种适用于所有类型对象的解决方案。C ++ 03解决方案会不错,但我也对C ++ 11解决方案感兴趣。如果可能,让我们避免任何特定于实现的行为。 我知道C ++ 11的std::addressof功能模板,但对在这里使用它不感兴趣:我想了解标准库实现者如何实现此功能模板。

14
是什么使Scala的运算符重载“好”,而C ++的“坏”?
许多人认为C ++中的运算符重载是一个坏东西(tm),并且是一个错误,不要在较新的语言中重复出现。当然,这是设计Java时专门删除的一项功能。 既然我已经开始阅读Scala,我发现它看起来非常类似于运算符重载(尽管从技术上讲,它没有运算符重载,因为它没有运算符,只有函数)。但是,它似乎与C ++中的运算符重载在质量上没有什么不同,在C ++中,我记得运算符被定义为特殊函数。 因此,我的问题是什么使Scala中定义“ +”的想法比C ++中的想法更好?


5
重载成员访问运算符->,。*
据我所知大多数运算符重载,与成员访问运营商外-&gt;,.*,-&gt;*等。 特别是,什么传递给这些运算符,应该返回什么? 操作员功能(例如operator-&gt;(...))如何知道所引用的成员?能知道吗 它甚至需要知道吗? 最后,是否需要考虑任何常量注意事项?例如,当重载类似的东西时operator[],通常将需要const版本和非const版本。成员访问运算符是否需要const和非const版本?

8
应该将operator <<实现为朋友还是成员函数?
这基本上就是问题,是否有“正确”的实施方法operator&lt;&lt;?阅读此内容,我可以看到类似以下内容的内容: friend bool operator&lt;&lt;(obj const&amp; lhs, obj const&amp; rhs); 比类似的东西更喜欢 ostream&amp; operator&lt;&lt;(obj const&amp; rhs); 但是我不太明白为什么要使用其中一个。 我的个人情况是: friend ostream &amp; operator&lt;&lt;(ostream &amp;os, const Paragraph&amp; p) { return os &lt;&lt; p.to_str(); } 但是我可能可以做: ostream &amp; operator&lt;&lt;(ostream &amp;os) { return os &lt;&lt; paragraph; } 我应该基于什么理由做出此决定? 注意事项: Paragraph::to_str = (return paragraph) 其中段落是一个字符串。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.