标签: operator-overloading

运算符在类外重载

有两种方法可以为C++类重载运算符:

课内

class Vector2
{
public:
    float x, y ;

    Vector2 operator+( const Vector2 & other )
    {
        Vector2 ans ;
        ans.x = x + other.x ;
        ans.y = y + other.y ;
        return ans ;
    }
} ;
Run Code Online (Sandbox Code Playgroud)

课外

class Vector2
{
public:
    float x, y ;
} ;

Vector2 operator+( const Vector2& v1, const Vector2& v2 )
{
    Vector2 ans ;
    ans.x = v1.x + v2.x ;
    ans.y = v1.y + v2.y ;
    return ans ;
}
Run Code Online (Sandbox Code Playgroud)

(显然在C#中你只能使用"外部类"方法.) …

c++ operator-overloading

44
推荐指数
3
解决办法
5万
查看次数

我可以使用'=='来比较两个向量.我试过了,似乎工作正常.但我不知道它是否适用于更复杂的情况

第一个例子:

int main(){
    using namespace std;   
    vector<int> v1{10, 20, 30, 40, 50};
    vector<int> v2{10, 20, 30, 40, 50};

    if(v1==v2)
        cout<<"equal";
    else
        cout<<"unequal";
}   // it returns equal 
Run Code Online (Sandbox Code Playgroud)

第二个例子:

int main(){
    using namespace std;   
    vector<int> v1{10, 20, 30, 40, 50};
    vector<int> v2{10, 20, 100000, 40, 50};

    if(v1==v2)
        cout<<"equal";
    else
        cout<<"unequal";
}   // it returns notequal 
Run Code Online (Sandbox Code Playgroud)

c++ equality vector operator-overloading

44
推荐指数
3
解决办法
5万
查看次数

运算符在python中重载

可能重复:
Python:定义我自己的运算符?
在python中何时使用运算符重载的经验法则

是否有可能在Python中重载运算符?如果是这样,可以定义新的运算符,例如++<<

python operator-overloading

43
推荐指数
2
解决办法
7万
查看次数

有没有办法在python中重载+ =?

我知道__add__覆盖加号的方法,但是当我用它来覆盖+ =时,我最终遇到两个问题之一:

(1)如果__add__变异自我,那么

z = x + y
Run Code Online (Sandbox Code Playgroud)

当我不想让x在那里变异时,我会改变x.

(2)如果__add__返回一个新对象,那么

tmp = z
z += x
z += y
tmp += w
return z
Run Code Online (Sandbox Code Playgroud)

将返回没有w的东西,因为z和tmp在z += x执行后指向不同的对象.

我可以制作某种.append()方法,但+=如果有可能,我宁愿超载.

python operator-overloading

42
推荐指数
1
解决办法
1万
查看次数

C++:为前后增量重载++

我们可以operator++为预增量和后增量重载吗?即正确调用SampleObject++++SampleObject结果.

class CSample {
 public:
   int m_iValue;     // just to directly fetch inside main()
   CSample() : m_iValue(0) {}
   CSample(int val) : m_iValue(val) {}
   // Overloading ++ for Pre-Increment
   int /*CSample& */ operator++() { // can also adopt to return CSample&
      ++(*this).m_iValue;
      return m_iValue; /*(*this); */
   }

  // Overloading ++ for Post-Increment
 /* int operator++() {
        CSample temp = *this;
        ++(*this).m_iValue;
        return temp.m_iValue; /* temp; */
    } */
};
Run Code Online (Sandbox Code Playgroud)

我们不能仅仅基于返回类型重载函数,并且即使我们将其视为允许的,它也不能解决问题,因为调用解析的模糊性.

由于提供了运算符重载以使内置类型的行为类似于用户定义的类型,为什么我们不能同时为我们自己的类型利用前置和后置增量.

c++ operator-overloading

42
推荐指数
4
解决办法
5万
查看次数

可以覆盖null合并运算符吗?

是否可以在C#中覆盖类的null-coalescing运算符?

比方说,如果实例为null,我想返回默认值,如果不是,则返回实例.代码看起来像这样:

   return instance ?? new MyClass("Default");  
Run Code Online (Sandbox Code Playgroud)

但是如果我想使用null-coalescing运算符来检查是否设置了MyClass.MyValue呢?

当然没有真正的需要(至少我是这么认为) - 所以在你回答"你为什么要这样做"之前 - 我只是好奇是否有可能.

.net c# operator-overloading null-coalescing-operator

41
推荐指数
3
解决办法
3850
查看次数

为什么使用强制语法不调用"operator void"?

用户GMan使用此答案时,我制作了以下代码段(使用Visual C++ 9编译):

 class Class {
 public:
     operator void() {}
 };

 Class object;
 static_cast<void>( object );
 (void)object;
 object.operator void();
Run Code Online (Sandbox Code Playgroud)

在使用调试器踩到后,我发现转换为void不调用Class::operator void(),只有第三个invokation(显式调用运算符)实际上调用了运算符,两个转换只是什么都不做.

为什么operator void不使用强制语法调用?

c++ casting operator-overloading operators

40
推荐指数
1
解决办法
2700
查看次数

使运营商<<虚拟?

我需要使用虚拟<<运算符.但是,当我尝试写:

virtual friend ostream & operator<<(ostream& os,const Advertising& add);
Run Code Online (Sandbox Code Playgroud)

我得到编译器错误

错误1错误C2575:'operator <<':只有成员函数和基数可以是虚拟的

如何将此运算符设为虚拟?

c++ virtual operator-overloading operators

40
推荐指数
2
解决办法
3万
查看次数

为什么重载运算符不能被定义为类的静态成员?

C++语法允许在struct/class中定义重载运算符,如:

struct X
{
   void operator+(X);
}
Run Code Online (Sandbox Code Playgroud)

或者在struct/class之外,如:

void operator+(X, X);
Run Code Online (Sandbox Code Playgroud)

但不是

struct X
{
   static void operator+(X, X);
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道这个决定的理由?为什么不允许第三种形式?(MSVC给出语法错误).也许这背后有一些故事?

ps同时存在第一个和第二个定义会产生歧义:

1>CppTest1.cxx
1>c:\ballerup\misc\cf_html\cpptest1.cxx(39) : error C2593: 'operator +' is ambiguous
1>        c:\ballerup\misc\cf_html\cpptest1.cxx(13): could be 'void B1::operator +(B1 &)'
1>        c:\ballerup\misc\cf_html\cpptest1.cxx(16): or       'void operator +(B1 &,B1 &)'
1>        while trying to match the argument list '(B1, B1)'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这种模糊性比1,3或2,3更好.

c++ static-methods operator-overloading

40
推荐指数
2
解决办法
2万
查看次数

运算符[]的负指数是否定义明确?

我知道编码风格会很糟糕,但是下面的代码在我的机器上运行得很好.但这种行为是否定义明确?便携式?

int main()
{
    int *p = new int[3];
    int *q = &p[2];
    q[-1] = 41;
    std::cout << p[1];
    delete[] p;
}
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading language-lawyer

40
推荐指数
3
解决办法
2480
查看次数