【运算符】



       在进行运算时,假设右括号的话我们知道先运算哪个,那假设没有括号了。算术运算符,关系运算符,逻辑运算符,位运算符。赋值运算符,++、--运算符等等,那么多的运算符。我们先算哪边。也就是这些运算符的优先级怎么排序呢?

优先级 操作符 描写叙述 样例 结合性
1 ()

[]

->

.

::

++

--
调节优先级的括号操作符

数组下标訪问操作符

通过指向对象的指针訪问成员的操作符

通过对象本身訪问成员的操作符

作用域操作符

后置自增操作符

后置自减操作符
(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-- ) ...
从左到右
2 !

~

++

--

-

+

*

&

(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);
从右到左
3 ->*

.*
在指针上通过指向成员的指针訪问成员的操作符

在对象上通过指向成员的指针訪问成员的操作符
ptr->*var = 24;

obj.*var = 24;
从左到右
4 *

/

%
乘法操作符

除法操作符

取余数操作符
int i = 2 * 4;

float f = 10 / 3;

int rem = 4 % 3;
从左到右
5 +

-
加法操作符

减法操作符
int i = 2 + 3;

int i = 5 - 1;
从左到右
6 <<

>>
按位左移操作符

按位右移操作符
int flags = 33 << 1;

int flags = 33 >> 1;
从左到右
7 <

<=

>

>=
小于比較操作符

小于或等于比較操作符

大于比較操作符

大于或等于比較操作符
if( i < 42 ) ...

if( i <= 42 ) ...

if( i > 42 ) ...

if( i >= 42 ) ...
从左到右
8 ==

!=
等于比較操作符

不等于比較操作符
if( i == 42 ) ...

if( i != 42 ) ...
从左到右
9 & 按位与操作符 flags = flags & 42; 从左到右
10 ^ 按位异或操作符 flags = flags ^ 42; 从左到右
11 | 按位或操作符 flags = flags | 42; 从左到右
12 && 逻辑与操作符 if( conditionA && conditionB ) ... 从左到右
13 || 逻辑或操作符 if( conditionA || conditionB ) ... 从左到右
14 ? : 三元条件操作符 int i = (a > b) ?

a : b;

从右到左
15 =

+=

-=

*=

/=

%=

&=

^=

|=

<<=

>>=
赋值操作符

复合赋值操作符(加法)

复合赋值操作符(减法)

复合赋值操作符(乘法)

复合赋值操作符(除法)

复合赋值操作符(取余)

复合赋值操作符(按位与)

复合赋值操作符(按位异或)

复合赋值操作符(按位或)

复合赋值操作符(按位左移)

复合赋值操作符(按位右移)
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;
从右到左
16 , 逗号操作符 for( i = 0, j = 0; i < 10; i++, j++ ) ... 从左到右

        额,表格上这么多。还有同样表示的,比如。&既能够作为取地址操作符又能够作为位与操作符。瞬间晕啦。

       咱们来分析一下,将这个表格变简单。

       首先,看结合性。分为两种:从左到右(大部分),从右到左。

       然后,再看优先级。一个最高,一个最低。最低的就是逗号,这个方便记忆,那最高的呢,有什么共同点?就是构造类型元素或成员以及括号。(这点还有些疑问)

       其次。运算符依据操作数,是不是分为单目,双目,三目运算符。
在表中。优先级为2的为单目运算符,优先级为3~13的为双目运算符。优先级为14的为三目运算符。优先级为15的为赋值运算符。

  但是双目运算符中还分好多级呢,这怎么办?接着看呗!3算作指针訪问成员运算符,4~5为算术运算符(先“乘除取余”后“加减”),6为移位操作符。7~8为关系运算符(先比大小,后算相等)。9~11为逻辑位操作符(先“与”后“或”。“异或”放中间),12~13为逻辑操作符(先“与”后“或”)。

也就是,算术。关系。逻辑。移位,逻辑位按序插入当中。


       最后。C++运算符优先级为:一个最高(构造类型的元素或成员以及括号);一个最低(逗号)。指针訪问成员排老三。一,二。三,赋值。双目运算符。算术关系逻辑,移位、逻辑位按序插入当中。



【运算符重载】


        运算符重载是面向对象中多态性的表现,是一种使用同一个运算符作用于不同类型的数据会有不同的行为的机制。

1、运算符重载条件:(除5种运算符外。其它均可重载)


.            成员选择运算符
.*          成员指针运算符
::           作用于分辨符
?;          条件运算符
sizeof    计算数据大小运算符

        这几种运算符也是属于比較特殊的一类。

成员选择 条件 作用指针的运算符来计算数据大小


2、运算符重载规则(1不能,3不变)


(1)1不能:不能重载C++中没有的运算符

(2)3不变:原操作个数。原语义。原优先级和结合性。


3、运算符函数重载两种形式


(1)重载为类的友元函数

   friend  函数类型  operator  运算符(形參表){函数体;}

(2)重载为类的成员函数

   返回类型  (类名 :: ) operator
运算符(形參表){函数体;}

(3)比較

成员函数:单目运算符,类型转换函数,运算符操作改动对象。
友元函数:双目运算符。操作数隐式类型转换,运算具有可交互性。
注意:双目运算符=,[ ],(),—>不能重载为类的友元函数。


【总结】



        对于C++真题上的操作题。看到运算符多的往往不知道先算哪边的,如今总结一下,有利于提高做题的效率。在我做过的题其中,运算符重载一般出在选择题上。

        事实上,对运算符优先级的记忆是上网查的。然后自己分析的。

这使我明确,不管看到多么多的知识。仅仅要你找就一定能找到联系的,而且可以编织属于你的知识网。

所以。遇到困难。不要怕,从多角度分析一点点,一切都可以解决。

版权声明:本文博主原创文章,博客,未经同意不得转载。

【C++知识汇总】运营商 &amp; 运算符重载的更多相关文章

  1. C/C++编程笔记:C++入门知识丨运算符重载

    本篇要学习的内容和知识结构概览 运算符重载使用场景 常规赋值操作 我们现在有一个类 想要实现这种赋值操作 具体实现如下: 所以说呢,我们在使用运算符进行运算的时候, 实际上也是通过函数来实现运算的. ...

  2. C++ Primer笔记10_运算符重载_赋值运算符_进入/输出操作符

    1.颂值运营商 首先来福值运算符引入后面要说的运算符重载.上一节说了构造函数.拷贝构造函数:一个类要想进行更好的控制.须要定义自己的构造函数.拷贝构造函数.析构函数.当然,还有赋值运算符.常说的三大函 ...

  3. 【足迹C++primer】49、超载,变化,运营商

    超载,变化,运营商 Conversion Operators 转换操作符 operator type() const Conversions to an array or a function typ ...

  4. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  5. 【足迹C++primer】49、超载,更改,运营商

    超载,更改.运营商 Conversion Operators 转换操作符 operator type() const Conversions to an array or a function typ ...

  6. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  7. CSP -- 运营商内容劫持(广告)的终结者

    缘由 我们公司最近手机端H5 经常受到商户和用户的投诉,说有广告并且导致不能正常进行操作,我们商户自己当然不会加广告了,但是商户和用户可不管这些了,就认为是我们的问题 探索发现根本 目前我们用的很多浏 ...

  8. C++学习笔记之运算符重载

    一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...

  9. C++之运算符重载(1)

    在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有 ...

随机推荐

  1. ibatis dynamic的用法

    <select id="idididid" resultClass="java.uitl.HashMap" parameterClass="ja ...

  2. Nagios+pnp4nagios+rrdtool 安装配置nagios被监控端NRPE配置(二)

    NRPE监控插件基础 NRPE总共由两部分组成: (1).check_nrpe插件,运行在监控主机上. (2).NRPE daemon,运行在远程的linux主机上(通常就是被监控机) 整个的监控过程 ...

  3. adt-bundle-windows-x86_32-20140702

    adt-bundle-windows-x86_32-20140702 Windows > Preference,在Android里没有NDK选项 法一:help->install new ...

  4. Javascript语言精粹之String常用方法分析

    Javascript语言精粹之String常用方法分析 1. String常用方法分析 1.1 String.prototype.slice() slice(start,end)方法复制string的 ...

  5. linux下使用vi操作

    ESC : 进入命令模式 linux下使用vi后,怎样跳转到文件结尾 pagedown键连续按 虽然我也这么用,但还是太笨了.问了高手,方法是按shift+g,另外,到文件开头是gg.   linux ...

  6. 如何解决Windows8.1(32bit&amp;64bit)下Cisco VPN Client拨号时报442错误的问题

    Cisco VPN Cient大多数网络管理员.技术支持project最流行的教师和最终用户VPNclient一间.对于外部网络访问内部网络,技术类人员. 随着Windows8.1的推出.Cisco ...

  7. swift学习笔记(六)析关闭过程和使用分配给属性的默认值

    一.通过关闭和功能的默认实现财产值 当存储属性默认值需要定制,能为客户提供通过关闭或全局函数的自定义默认值. 注意:全局函数的结构,和枚举使用keywordstatic大喊    用classkeyw ...

  8. hdu1561(树形背包)

    给定n,m表示n个城堡,我们可以选择攻占m个城堡.要使得价值最大 接下来n行 a b,   第i行的a b,表示攻占第i个城堡的价值为b,但需要先攻占第a个城堡 如果有多个a=0的点,那么就不是一棵树 ...

  9. 排序算法c语言描述---冒泡排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  10. Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、检查操作

    package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android. ...