【运算符】



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

优先级 操作符 描写叙述 样例 结合性
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. Nagios+pnp4nagios+rrdtool 安装配置nagios(一)

    基于的软件版本 Apache-2.0.63  php-5.3.2 nagios-3.2.3  nagios-plugins-1.4.15  rrdtool-1.4.5 nrpe-2.12 pnp4na ...

  2. bash,bg,bind,break,builtin,caller,compgen, complete,compopt,continue,declare,dirs,disown,enable,eval,exec,expo

    bash,bg,bind,break,builtin,caller,compgen, complete,compopt,continue,declare,dirs,disown,enable,eval ...

  3. s有一天,教你开始truts2

    写在前面 他也是一个java和java web新秀.此前有过接触java web发展 我想一个小项目.要熟悉struts2开发过程 一个有趣的想法源于教研室项目上的一个功能实现–自己主动识别运营商,去 ...

  4. hdu3037(lucas定理)

    给定n,m,p   表示<=m个豆子放在n棵树上,一共有多少种方案数,  总的方案书mod p 如果将m个豆子放在n棵树上, 可以使用插板法 得到方案数是C(n+m-1,n-1) 那么将0< ...

  5. Oracle SQL Lesson (10) - 使用DDL语句创建和管理表

    数据库对象TableViewSequenceIndexSynonym 对象名称最长30个字符,不能与当前用户下其他对象重名.create table "select" as sel ...

  6. Java面试题集(136-150)

    摘要:目,尽管仅仅有15道题目.可是包括的信息量还是非常大的,非常多题目背后的解题思路和算法是非常值得玩味的. 136.给出以下的二叉树先序.中序.后序遍历的序列? 答:先序序列:ABDEGHCF.中 ...

  7. repo总结

    repo刚google使用Python脚本写通话git脚本.主要用于下载.管理Android工程仓库. 1. 下载 repo 的地址: http://android.git.kernel.org/re ...

  8. go语言实现遍历目录,及查找特定的文件类型

    // filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...

  9. cer, pfx 创建,而且读取公钥/密钥,加解密 (C#程序实现)

    PKI技术(public key infrastructure)里面,cer文件和pfx文件是非经常见的.通常cer文件中面保存着公钥以及用户的一些信息,pfx里面则含有私钥和公钥. 用makecer ...

  10. js多个物体运动的问题1

    问题2 http://www.cnblogs.com/huaci/p/3854304.html 用js写一个物体的运动很简单.如果一个页面有多个物体在运动,它会不会出问题呢? ok,我们来看一个示例 ...