ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++篇:第二章_运算符_知识点大全

2022-04-10 01:01:46  阅读:182  来源: 互联网

标签:知识点 函数 个数 C++ 运算符 按位 重载


  • C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器

二、运算符

(一)运算符本身运用限制

  1. %取余运算符要求运算数必须是整型,浮点数取余用fmod(x,y),若不符则会发生编译错误

  2. 加加运算符并不会提高运行时效率,反而会降低,只是为了代码更精简

  3. 按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型不适用

  4. 在一个式子中如果有两个以上同一优先级的运算符,其运算次序是按运算符的结合性(自右向左和自左向右)来处理

5.不能用于浮点数的运算符:

① 求余数% 和%=

② 下标[]

③ 所有的位运算符:& | ^ ~ << >>,还有&= | = ^= <<= >>=

  1. 在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值fabs(a-b) 是否小于某个阈值,例如 1e-9

(二)运算符运用

  1. 三目运算符从右到左运算

  2. (3,2,1,0) 可作为C++合法表达式,这是一个逗号表达式

  3. sizeof(double) 是一个整型表达式 // sizeof是运算符,不是函数,sizeof的结果是无符号整数,可以把它看作是无符号整型表达式

  4. sizeof是运算符,在编译时即计算好了,在头文件中typedef为unsigned int,参数可以是数组、指针、类型、对象、函数等

  5. strlen是函数,要在运行时才能计算。参数必须是字符型指针。当数组名作为参数传入时,实际上数组就退化成指针了

  6. a与0xf(十进制即15)做异或操作,可以实现低四位的翻转。

  7. 如果是| 按位或 ,则将低四位数全变成1.
    如果是& 按位与,则结果不变。

  8. (3++)++4 = 35 = 15 // 3++返回的是3

  9. 运算符“>>”执行算术右移,每移一位,第一个操作数被2除一次;按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。

​ 运算符“<<”执行算术左移,在数字没有溢出的前提下,对于正数和负数,左移一位都 相当于乘以2的1次方,左移n位就相当于乘以2的n次方;按二进制形式把所有的数 字向左移动对应的位数,高位移出(舍弃),低位的空位补零

逻辑右移或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充 左侧的空位。

​ 算术右移不改变原数的符号,而逻辑右移不能保证这点。

  1. 移位运算符约简其右侧的操作数,当左侧操作数是int类型时,右侧以32取模;当左侧是long类型时,右侧以64取模

  2. Int i=1,~i=-2 //C++中非表示为!

因为假设int占2个字节,那么1的二进制表示是 0000 0001 ,~表示按位取反,则 0000 0001变为 1111 1110(为负数),在计算机中整数用补码形式表示,正数的补码是它 本身,负数的补码是原数值除符号位按位取反再加一,由补码求原数值也是按位取反再 加一,那么 1111 1110 除符号位按位取反再加一变成 1000 0010,即 -2(取反后若为 负数则还要按位取反再加一求出原数值)

  1. 1+1=1 // 为二进制的逻辑运算,真且真=真(故1/1、1-1、1+1=10都不是逻辑运算)

  2. C++支持连等的情况只有变量在前面已定义的背景下才支持,故int a = b = 7; //错误,因为只是定义了a,没定义b(结合笔记的赋值表达式)

  3. 逻辑表达式的返回值是0,1

  4. x&(x-1)统计1的个数,x|(x+1)统计0的个数

  5. 因为i++在计算时,会用到中间变量存储,会占用更多的内存和时间。所以++i更好

(三)运算符重载

1.运算符重载的规则:

① 只能重载已有的且被允许重载的运算符。

② 重载之后,运算符的优先级和结合性不会改变,也不能够改变。

③ 重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时重载运算符必须具有一个类对象(或类对象的引用)的参数

④ 运算符重载函数不能使用默认参数

⑤ 成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、三目条件运算符“?:”不能重载

⑥ 赋值运算符“=”,下标运算符“[]”,函数调用运算符“()”,成员运算符“->”必须作为成员函数重载

⑦ 流插入和流提取运算符,类型转换运算符函数只能作为友元函数

⑧ 在自增自减运算符重载函数中,增加一个int型形参,就是后置了

  1. operator写在返回类型后运算符号前,故运算符函数的函数名就是“operator运算符号”

  2. 一般运算结果作为左值则返回引用类型,作为右值则返回对象

  3. 如果运算符左侧的操作数属于C++标准类型或是一个其他类的对象(非本类时),则运算符重载函数只能作为非成员函数

​ 5.运算符重载为类的成员函数:

① 运算符函数的形式参数个数比运算符规定的运算对象个数要少一个

② 双目运算符重载为类的成员函数形参个数为1个(const 所属类型 &obj)

③ 前置单目运算符重载为类的成员函数形参个数为0

④ 后置单目运算符重载为类的成员函数形参个数为1(如int)

⑤ 当运算符重载为友元函数时,运算符函数的形参个数和运算符规定的运算对象个数一致

(1) 双目形参为(const 所属类型 &obj1,const 所属类型 &obj2)

(2) 前置单目形参为(const 所属类型 &obj)

(3) 后置单目形参为(const 所属类型 &obj,int)

6. 典型运算符的重载:

① 复合的赋值运算符重载:因为具有“给运算对象重新赋值”的功能,运算符函数需要返回引用类型

② 重载流运算符:运算符函数返回流对象的引用类型,且流插入和提取重载函数不能是类的成员函数

③ 重载类型转换运算符(将类类型显示的转换为其他数据类型):只能作为类的成员函数

标签:知识点,函数,个数,C++,运算符,按位,重载
来源: https://www.cnblogs.com/oten/p/16124469.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有