C++篇:第二章_运算符_知识点大全
作者:互联网
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器
二、运算符
(一)运算符本身运用限制
-
%取余运算符要求运算数必须是整型,浮点数取余用fmod(x,y),若不符则会发生编译错误
-
加加运算符并不会提高运行时效率,反而会降低,只是为了代码更精简
-
按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型不适用
-
在一个式子中如果有两个以上同一优先级的运算符,其运算次序是按运算符的结合性(自右向左和自左向右)来处理
5.不能用于浮点数的运算符:
① 求余数% 和%=
② 下标[]
③ 所有的位运算符:& | ^ ~ << >>,还有&= | = ^= <<= >>=
- 在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值fabs(a-b) 是否小于某个阈值,例如 1e-9
(二)运算符运用
-
三目运算符从右到左运算
-
(3,2,1,0) 可作为C++合法表达式,这是一个逗号表达式
-
sizeof(double) 是一个整型表达式 // sizeof是运算符,不是函数,sizeof的结果是无符号整数,可以把它看作是无符号整型表达式
-
sizeof是运算符,在编译时即计算好了,在头文件中typedef为unsigned int,参数可以是数组、指针、类型、对象、函数等
-
strlen是函数,要在运行时才能计算。参数必须是字符型指针。当数组名作为参数传入时,实际上数组就退化成指针了
-
a与0xf(十进制即15)做异或操作,可以实现低四位的翻转。
-
如果是| 按位或 ,则将低四位数全变成1.
如果是& 按位与,则结果不变。 -
(3++)++4 = 35 = 15 // 3++返回的是3
-
运算符“>>”执行算术右移,每移一位,第一个操作数被2除一次;按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
运算符“<<”执行算术左移,在数字没有溢出的前提下,对于正数和负数,左移一位都 相当于乘以2的1次方,左移n位就相当于乘以2的n次方;按二进制形式把所有的数 字向左移动对应的位数,高位移出(舍弃),低位的空位补零
逻辑右移或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充 左侧的空位。
算术右移不改变原数的符号,而逻辑右移不能保证这点。
-
移位运算符约简其右侧的操作数,当左侧操作数是int类型时,右侧以32取模;当左侧是long类型时,右侧以64取模
-
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=10都不是逻辑运算)
-
C++支持连等的情况只有变量在前面已定义的背景下才支持,故int a = b = 7; //错误,因为只是定义了a,没定义b(结合笔记的赋值表达式)
-
逻辑表达式的返回值是0,1
-
x&(x-1)统计1的个数,x|(x+1)统计0的个数
-
因为i++在计算时,会用到中间变量存储,会占用更多的内存和时间。所以++i更好
(三)运算符重载
1.运算符重载的规则:
① 只能重载已有的且被允许重载的运算符。
② 重载之后,运算符的优先级和结合性不会改变,也不能够改变。
③ 重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时重载运算符必须具有一个类对象(或类对象的引用)的参数
④ 运算符重载函数不能使用默认参数
⑤ 成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、三目条件运算符“?:”不能重载
⑥ 赋值运算符“=”,下标运算符“[]”,函数调用运算符“()”,成员运算符“->”必须作为成员函数重载
⑦ 流插入和流提取运算符,类型转换运算符函数只能作为友元函数
⑧ 在自增自减运算符重载函数中,增加一个int型形参,就是后置了
-
operator写在返回类型后运算符号前,故运算符函数的函数名就是“operator运算符号”
-
一般运算结果作为左值则返回引用类型,作为右值则返回对象
-
如果运算符左侧的操作数属于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