运算符及其重载.
算数运算符
运算符 | 作用 |
---|---|
+/-/*// | 操作数相加/相减/相乘/相除 |
% | 取模,整除后的余数 |
++/– | 自增/自减 |
关系运算符
运算符 | 作用 |
---|---|
== | 检查操作数是否相等,相等返回1 |
!= | 判断操作做是否不相等,不相等返回1 |
>/</>=/<= | 判断操作数是否大于,小于,大于等于 ,小于等于,如果为真返回1 |
逻辑运算符
运算符 | 作用 |
---|---|
&& | 两边都为真,返回1 |
II | 两边有一个为真,返回1 |
! | 逆转操作数的逻辑状态,如果为真,则使其为假 |
位运算符
运算符 | 作用 |
---|---|
& | 按位相与,相同为1,不同为0 |
I | 按位相或,有1为1,没1为0 |
^ | 异或,不同为1,相同为0 |
~ | 按位取反 |
<< | 左移位置 |
>> | 右移位置 |
赋值运算符
运算符 | 作用 |
---|---|
= | 右边操作数赋值给左边操作数 |
+=/-=//=/*=/%= | 把左操作数加/减/乘/除/取模右操作数后赋值给左操作数 |
运算符优先级
运算符 | 描述 | 例子 | 优先级 | 结合性 |
---|---|---|---|---|
() [] -> . :: ++ – | 调节优先级的括号操作符 数组下标访问操作符 通过指向对象的指针访问成员的操作符 通过对象本身访问成员的操作符 作用域操作符 后置自增操作符 后置自减操作符 | (a+b)/4; array[4]=2; ptr->age=34; obj.age=34; Class::age=2; for(i=0;i<10;i++){} for(i=10;i>0;i–){} | 1 | 从左到右 |
! ~ ++ – - + * & (type) sizeof | 逻辑取反操作符 按位取反(按位取补) 前置自增操作符 前置自减操作符 一元取负操作符 一元取正操作符 解引用操作符 取地址操作符 类型转换操作符 返回对象占用的字节数操作符 | if(!done) flags=~flags; for(i=0;i<10;++i){} for(i=10;i>0;–i){} int i=-1; int i=+1; data=*ptr; address=&obj; int i=(int)floatNum; int size=sizeof(floatNum); | 2 | 从右到左 |
* / % | 乘法操作符 除法操作符 取余数操作符 | int i=2*4; float f=10/3; int rem=4%3; | 3 | 从左到右 |
+ - | 加法 减法 | int i=2+3; int i=5-1; | 4 | 从左到右 |
<< >> | 按位左移 按位右移 | int flags=33<<1; int flags=33>>1; | 5 | 从左到右 |
< <= > >= | 小于比较操作符 小于或等于比较操作符 大于比较操作符 大于或等于比较操作符 | if(i<42)… if(i<=42)… if(i>42)… if(i>=42)… | 6 | 从左到右 |
== != | 等于比较操作符 不等于比较操作符 | if(i==42)… if(i!=42)… | 7 | 从左到右 |
& | 按位与操作符 | flags=flags&42; | 8 | 从左到右 |
^ | 按位异或操作符 | flags=flags^42; | 9 | 从左到右 |
I | 按位或操作符 | 按位或操作符 | 10 | 从左到右 |
&& | 逻辑与操作符 | 逻辑与操作符 | 11 | 从左到右 |
II | 逻辑或操作符 | if(conditionA | conditionB)… | |
? : | 三元条件操作符 | int i=(a>b)?a:b; | 13 | 从右到左 |
= += -= *= /= %= &= ^= I= <<= >>= | 赋值操作符 复合赋值操作符(加法) 复合赋值操作符(减法) 复合赋值操作符(乘法) 复合赋值操作符(除法) 复合赋值操作符(取余) 复合赋值操作符(按位与) 复合赋值操作符(按位异或) 复合赋值操作符(按位或) 复合赋值操作符(按位左移) 复合赋值操作符(按位右移) | int a=b; a+=3; b-=4; a*=5; a/=2; a%=3; flags&=new_flags; flags^=new_flags; flags | =new_flags; flags<<=2; flags>>=2; | 14 |
, | 逗号操作符 | for(i=0,j=0;i<10;i++,j++)… | 15 | 从左到右 |
以上摘自:http://www.jsons.cn/levelcadd/
运算符重载
运算符重载就是运算符与类结合,给予运算符新的方法,实现了类的多态性。
#include<iostream>
using namespace std;
class Entity
{
public:
int x;
int y;
Entity(int X,int Y):x(X),y(Y) {};
Entity operator+(const Entity& A)const {
return Add(A);
}
Entity Add(const Entity& B) const {
return Entity(x + B.x, y + B.y);
}
};
ostream& operator<<(ostream& stream, Entity& A){
stream << A.x << "," << A.y << endl;
return stream;
}
int main() {
Entity A(1, 2);
Entity B(3, 4);
Entity C = A + B;
cout << C << endl;
cin.get();
}
这里对加法以及按位左移运算符进行重载,使其能够对类中的成员变量进行操作。
ostream& operator<<(ostream& stream, Entity& A){
stream << A.x << "," << A.y << endl;
return stream;
}
这一段的意思是为’ostream’(输出流)类型和’Entity’类型定义了一个重载的插入运算符’<<‘。这个函数的具体作用是,当你在输出流中使用’<<'运算符插入一个’Entity’类型的对象时,会先将’Entity’对象的’x’和’y’属性值以逗号分隔的形式输出,然后在末尾添加一个换行符。函数最后返回了输出流,这样可以链式地调用其他的输出操作。