您的位置:首页 > 编程语言 > C语言/C++

C++运算符能否重载以及优先级问题

2013-05-14 16:10 926 查看

C++中可重载的运算符:

算术运算符:+,-,*,/,%,++,--;

位操作运算符:&(按位与),|(按位或),~(按位求反),^(位异或),<<(左移),>>(右移)
逻辑运算符:!(逻辑求反),&&(逻辑与),||(逻辑或);
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他运算符:[],(),->,,(逗号运算符,优先级最低),new,delete,new[],delete[],->*。 

不能重载的运算符

.  (以对象方式访问成员):
?: (三目运算符/条件运算符):
sizeof :
:: (作用域解析):
.* (成员对象选择):


throw (抛出异常);

dynamic_cast ;

static_cast  ;

reinterpret_cast;

const_cast ;

typeid (获取类型信息) ;

1. 运算符重载后,优先级和结合性怎么办? 
  用户重载新定义运算符,不改变原运算符的优先级和结合性。这就是说,对运算符重载不改变运算符的优先级和结合性,并且运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载双目运算符。 

2. 编译程序如何选用哪一个运算符函数? 
  运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不很明显的运算时,编译程序将去寻找参数相匹配的运算符函数。 

3. 重载运算符有哪些限制? 
  (1) 不可臆造新的运算符。必须把重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中。
  (2) 重载运算符坚持4个“不能改变”。 
  ·不能改变运算符操作数的个数;
  ·不能改变运算符原有的优先级;
  ·不能改变运算符原有的结合性;
  ·不能改变运算符原有的语法结构。 

4. 运算符重载时必须遵循哪些原则? 
  运算符重载可以使程序更加简洁,使表达式更加直观,增加可读性。但是,运算符重载使用不宜过多,否则会带来一定的麻烦。 
  使用重载运算符时应遵循如下原则: 
  (1) 重载运算符含义必须清楚。 
  (2) 重载运算符不能有二义性
 

运算符优先级

以下是C++编程语言中的所有运算符的优先级结合性列表。

优先级运算符叙述示例重载性结合性
1
::
作用域解析(C++专有)
Class::age = 2;
由左至右
2
++
后缀递增i++ 
--
后缀递减i-- 
{}
组合{i++;a*=i;} 
()
函数调用或变量初始化c_tor(int x, int y) : _x(x), _y(y * 10) {} 
[]
数组访问array[4] = 2; 
.
以对象方式访问成员obj.age = 34;
->
以指针方式访问成员ptr->age = 34; 
dynamic_cast
运行时检查类型转换(C++专有)Y& y = dynamic_cast<Y&>(x);
static_cast
未经检查的类型转换(C++专有)Y& y = static_cast<Y&>(x);
reinterpret_cast
重定义类型转换(C++专有)int const* p = reinterpret_cast<int const*>(0x1234);
const_cast
更改非常量属性(C++专有)int* q = const_cast<int*>(p);
typeid
获取类型信息(C++专有)std::type_info const& t = typeid(x);
3
++
前缀递增++i 由右至左
--
前缀递减--i 
+
一元正号int i = +1; 
-
一元负号int i = -1; 
!

not
逻辑非
!
的备用拼写
if (!done) … 
~

compl
按位取反
~
的备用拼写
flag1 = ~flag2; 
(type)
强制类型转换int i = (int)floatNum; 
*
取指针指向的值int data = *intPtr; 
&
取变量的地址int *intPtr = &data; 
sizeof
某某的大小size_t s = sizeof(int);
new
动态内存分配(C++专有)long* pVar = new long; 
new[]
动态数组内存分配(C++专有)long* array = new long[20]; 
delete
动态内存释放(C++专有)delete pVar; 
delete[]
动态数组内存释放(C++专有)delete [] array; 
4
.*
成员对象选择(C++专有)obj.*var = 24;由左至右
->*
成员指针选择(C++专有)ptr->*var = 24; 
5
*
乘法int i = 2 * 4; 
/
除法float f = 10.0 / 3.0; 
%
模数(取余)int rem = 4 % 3; 
6
+
加法int i = 2 + 3; 
-
减法int i = 5 - 1; 
7
<<
比特左移int flags = 33 << 1; 
>>
比特右移int flags = 33 >> 1; 
8
<
小于关系if (i < 42) … 
<=
小于等于关系if (i <= 42) ... 
>
大于关系if (i > 42) … 
>=
大于等于关系if (i >= 42) ... 
9
==

eq
等于关系
==
的备用拼写
if (i == 42) ... 
!=

not_eq
不等于关系
!=
的备用拼写
if (i != 42) … 
10
&

bitand
比特 AND
&
的备用拼写
flag1 = flag2 & 42; 
11
^

xor
比特 XOR(独占or)
^
的备用拼写
flag1 = flag2 ^ 42; 
12
|

bitor
比特 OR(包含or)
|
的备用拼写
flag1 = flag2 | 42; 
13
&&

and
逻辑 AND
&&
的备用拼写
if (conditionA && conditionB) … 
14
||

or
逻辑 OR
||
的备用拼写
if (conditionA || conditionB) ... 
15
c?t:f
三元条件运算int i = a > b ? a : b;由右至左
16
=
直接赋值int a = b; 
+=
以和赋值a += 3; 
-=
以差赋值b -= 4; 
*=
以乘赋值a *= 5; 
/=
以除赋值a /= 2; 
%=
以取余数赋值a %= 3; 
<<=
以比特左移赋值flags <<= 2; 
>>=
以比特右移赋值flags >>= 2; 
&=

and_eq
以比特AND赋值
&=
的备用拼写
flags &= new_flags; 
^=

xor_eq
以比特XOR赋值
^=
的备用拼写
flags ^= new_flags; 
|=

or_eq
以比特OR赋值
|=
的备用拼写
flags |= new_flags; 
17
throw
抛出异常throw EClass(“Message”);
18
,
逗号运算符for (i = 0, j = 0; i < 10; i++, j++) … 由左至右
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++