Sou*_*lly 6 c++ operator-overloading
我意识到这是一个基本的问题,但我已经在网上搜索过,去了cplusplus.com,通读了我的书,我似乎无法掌握重载运算符的概念.cplusplus.com的一个具体示例是:
// vectors: overloading operators example
#include <iostream>
using namespace std;
class CVector {
public:
int x,y;
CVector () {};
CVector (int,int);
CVector operator + (CVector);
};
CVector::CVector (int a, int b) {
x = a;
y = b;
}
CVector CVector::operator+ (CVector param) {
CVector temp;
temp.x = x + param.x;
temp.y = y + param.y;
return (temp);
}
int main () {
CVector a (3,1);
CVector b (1,2);
CVector c;
c = a + b;
cout << c.x << "," << c.y;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从http://www.cplusplus.com/doc/tutorial/classes2/,但阅读它我仍然不理解它们.我只需要一个重载运算符的基本示例(我假设它是"CVector CVector :: operator +(CVector param)").
维基百科也有这个例子:
Time operator+(const Time& lhs, const Time& rhs)
{
Time temp = lhs;
temp.seconds += rhs.seconds;
if (temp.seconds >= 60)
{
temp.seconds -= 60;
temp.minutes++;
}
temp.minutes += rhs.minutes;
if (temp.minutes >= 60)
{
temp.minutes -= 60;
temp.hours++;
}
temp.hours += rhs.hours;
return temp;
}
Run Code Online (Sandbox Code Playgroud)
来自" http://zh.wikipedia.org/wiki/Operator_overloading "
我正在进行的当前任务我需要重载一个++和一个 - 运算符.
提前感谢您的信息,并对有些模糊的问题感到抱歉,遗憾的是我根本不确定.
Mic*_*urr 14
运算符重载是C++提供的技术,可让您定义如何将语言中的运算符应用于非内置对象.
在您的示例中,Time
运算符的类运算符重载+
:
Time operator+(const Time& lhs, const Time& rhs);
Run Code Online (Sandbox Code Playgroud)
通过该重载,您现在可以Time
以"自然"方式对对象执行添加操作:
Time t1 = some_time_initializer;
Time t2 = some_other_time_initializer;
Time t3 = t1 + t2; // calls operator+( t1, t2)
Run Code Online (Sandbox Code Playgroud)
操作符的重载只是一个函数,其特殊名称为"operator",后跟运算符重载的符号.大多数运营商都可能超载 - 不能是:
. .* :: and ?:
Run Code Online (Sandbox Code Playgroud)
您可以直接通过名称调用该函数,但通常不会(操作符重载点是能够正常使用运算符).
被调用的重载函数由对运算符的参数的正常重载决策决定 - 这就是编译器如何调用operator+()
使用Time
上面示例中的参数类型的方法.
重载++
和--
递增和递减运算符时需要注意的另一件事是每个版本有两个版本 - 前缀和后缀形式.这些运算符的后缀版本需要一个额外的int
参数(传递0并且没有其他目的,除了区分两种类型的运算符).C++标准有以下示例:
class X {
public:
X& operator++(); //prefix ++a
X operator++(int); //postfix a++
};
class Y { };
Y& operator++(Y&); //prefix ++b
Y operator++(Y&, int); //postfix b++
Run Code Online (Sandbox Code Playgroud)
您还应该知道,重载的运算符不必执行与内置运算符类似的操作 - 或多或少的正常函数,它们可以执行任何您想要的操作.例如,标准库的IO流接口使用移位运算符来输出和输入流 - 这实际上与位移不同.但是,如果你试图对操作符重载过于花哨,那么对于那些试图遵循你的代码的人来说会引起很大的困惑(甚至可能在你以后查看代码时也是如此).
小心使用运算符重载.