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++运算符优先级以及可否重载
- C++普通函数与模板函数以及特化函数重载的优先级问题
- 重载和重写以及重写的权限问题
- 在js中如何实现方法重载?以及函数的参数问题
- [置顶] 在js中如何实现方法重载?以及函数的参数问题
- java中long和float定义时的问题以及能否先自动类型提升再自动装箱
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- int转为short的问题以及类型转换、按位与、相等优先级
- 多线程的join方法和Yield方法以及优先级问题
- [Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑
- priority_queue 优先级队列的基本应用和重载问题
- C++运算符重载(成员函数以及友元函数实现)
- C++运算符重载(成员函数以及友元函数实现)
- 【html/css】选择器以及其优先级的问题
- [置顶] # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符
- Java Puzzlers笔记--puzzle 13: Animal Farm 优先级以及对象引用问题
- CSS优先级问题以及jQuery中的.eq()遍历方法和:eq()选择器的差别
- C++运算符及其重载问题
- [C/C++]c++运算符优先级和运算中类型转换问题!