如果我在Python中创建自己的类,我应该定义什么函数以允许使用'in'运算符,例如
class MyClass(object):
...
m = MyClass()
if 54 in m:
...
Run Code Online (Sandbox Code Playgroud) 请问您是否可以在Java中重载运算符?如果它在Java中的任何地方使用,请告诉我有关它的信息.
我正在尝试使用扩展方法向C#StringBuilder类添加一个operater重载.具体来说,给定StringBuilder sb,我想sb += "text"成为等同于sb.Append("text").
以下是为以下内容创建扩展方法的语法StringBuilder:
public static class sbExtensions
{
public static StringBuilder blah(this StringBuilder sb)
{
return sb;
}
}
Run Code Online (Sandbox Code Playgroud)
它成功地将blah扩展方法添加到了StringBuilder.
不幸的是,运算符重载似乎不起作用:
public static class sbExtensions
{
public static StringBuilder operator +(this StringBuilder sb, string s)
{
return sb.Append(s);
}
}
Run Code Online (Sandbox Code Playgroud)
除其他问题外,this在此上下文中不允许使用关键字.
是否可以通过扩展方法添加运算符重载?如果是这样,那么正确的方法是什么?
考虑以下程序:
struct ghost
{
// ghosts like to pretend that they don't exist
ghost* operator&() const volatile { return 0; }
};
int main()
{
ghost clyde;
ghost* clydes_address = &clyde; // darn; that's not clyde's address :'(
}
Run Code Online (Sandbox Code Playgroud)
我怎么得到clyde地址?
我正在寻找一种适用于所有类型对象的解决方案.C++ 03解决方案会很好,但我也对C++ 11解决方案感兴趣.如果可能,让我们避免任何特定于实现的行为.
我知道C++ 11的std::addressof函数模板,但我不想在这里使用它:我想了解标准库实现者如何实现这个函数模板.
C++中的运算符重载被许多人认为是坏事(tm),并且在新语言中不会重复错误.当然,这是设计Java时专门删除的一个功能.
现在我开始阅读Scala,我发现它看起来非常像运算符重载(虽然从技术上来说它没有运算符重载,因为它没有运算符,只有函数).但是,它似乎与C++中的运算符重载没有本质上的区别,因为我记得运算符被定义为特殊函数.
所以我的问题是什么使得在Scala中定义"+"的想法比在C++中更好?
运算符的短路行为&&,并||是程序员的好工具.
但为什么他们在超载时会失去这种行为?我理解运算符只是函数的语法糖,但操作符bool有这种行为,为什么它应该限制在这种类型?这背后有任何技术推理吗?
c++ operator-overloading short-circuiting logical-operators c++11
这基本上就是问题,是否有"正确"的实施方式operator<<?读这个我可以看到类似的东西:
friend bool operator<<(obj const& lhs, obj const& rhs);
Run Code Online (Sandbox Code Playgroud)
喜欢这样的东西
ostream& operator<<(obj const& rhs);
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么要使用其中一个.
我的个人案例是:
friend ostream & operator<<(ostream &os, const Paragraph& p) {
return os << p.to_str();
}
Run Code Online (Sandbox Code Playgroud)
但我可能会这样做:
ostream & operator<<(ostream &os) {
return os << paragraph;
}
Run Code Online (Sandbox Code Playgroud)
我应该根据这个决定做出什么理由?
注意:
Paragraph::to_str = (return paragraph)
Run Code Online (Sandbox Code Playgroud)
其中段落是一个字符串.
据我所知大多数运算符重载,与成员访问运营商外->,.*,->*等.
特别是,传递给这些操作符函数的内容以及应返回的内容是什么?
操作员如何运作(例如operator->(...))知道所指的成员是什么?可以知道吗?它甚至需要知道吗?
最后,是否需要考虑常见因素?例如,当重载类似的东西时operator[],通常你需要const和非const版本.成员访问运算符是否需要const和非const版本?
以下将导致==运算符重载方法的无限递归
Foo foo1 = null;
Foo foo2 = new Foo();
Assert.IsFalse(foo1 == foo2);
public static bool operator ==(Foo foo1, Foo foo2) {
if (foo1 == null) return foo2 == null;
return foo1.Equals(foo2);
}
Run Code Online (Sandbox Code Playgroud)
我如何检查空值?
我试图做操作符重载+=,但我不能.我只能让操作员超载+.
怎么会?
编辑
这不起作用的原因是我有一个Vector类(带有X和Y字段).请考虑以下示例.
vector1 += vector2;
Run Code Online (Sandbox Code Playgroud)
如果我的运算符重载设置为:
public static Vector operator +(Vector left, Vector right)
{
return new Vector(right.x + left.x, right.y + left.y);
}
Run Code Online (Sandbox Code Playgroud)
然后结果将不会添加到vector1,而是vector1也将通过引用成为全新的Vector.