C++中逻辑操作符的重载分析
1,逻辑运算符的原生语义:
1,操作数只有两种值(true 和 false);
1,C 语言中只有非 0 和 0;
2,逻辑表达式不用完全计算就能确定最终值;
1,短路规则;
3,最终结果只能是 true 或者 false;
2,逻辑表达式编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; int func(int i)
{
cout << "int func(int i) : i = " << i << endl; return i;
} int main()
{
if( func() && func() ) // func(1) 不会被调用;
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} cout << endl; if( func() || func() ) // func(0) 和 func(1) 都被调用;
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} return ;
}
3,逻辑操作符可以重载吗?重载逻辑操作符有什么意义?
1,可以重载;
4,重载逻辑操作符编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; class Test
{
int mValue;
public:
Test(int v)
{
mValue = v;
}
int value() const
{
return mValue;
}
}; /* 逻辑操作符必须返回 bool 类型 */
bool operator && (const Test& l, const Test& r)
{
return l.value() && r.value();
} bool operator || (const Test& l, const Test& r)
{
return l.value() || r.value();
} Test func(Test i)
{
cout << "Test func(Test i) : i.value() = " << i.value() << endl; return i;
} int main()
{
Test t0();
Test t1(); if( func(t0) && func(t1) ) // ==> operator && (func(t0), func(t1))
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} cout << endl; if( func() || func() ) // ==> operator || (func(0), func(1))
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} return ;
}
2,输出结果:
Test func(Test i) : i.value() =
Test func(Test i) : i.value() =
Result is false! Test func(Test i) : i.value() =
Test func(Test i) : i.value() =
Result is true!
3,重载的逻辑操作符都是从左向右调用操作数,短路规则不再适用;
5,重载逻辑操作符:
1,问题的分析:
1,C++ 通过函数调用扩展操作符的功能;
1,调用重载函数需要将两个操作数传递给函数进行调用,这就是问题的本质;
2,进入函数体前必须完成所有函数参数的计算;
3,函数参数的计算次序是不定的;
4,短路法则完全失效;
2,逻辑操作符重载后无法完全实现原生的语义;
1,无法通过函数调用满足短路规则;
3,一些有用的建议:
1,实际工程开发中避免重载逻辑操作符;
2,通过重载比较操作符代替逻辑操作符重载;
1,将一个对象与 true 或 false 比较,来重载;
3,直接使用成员函数代替逻辑操作符重载;
4,使用全局函数对逻辑操作符进行重载;
1,当必须实现逻辑操作符的重载时,用全局函数实现;
6,小结:
1,C++ 从语法上支持逻辑操作符重载;
2,重载后的逻辑操作符不满足短路法则;
3,工程开发中不要重载逻辑操作符;
4,通过重载比较操作符替换逻辑操作符重载;
5,通过专用成员函数替换逻辑操作符重载;
C++中逻辑操作符的重载分析的更多相关文章
- python中的逻辑操作符
python中主要有三个逻辑操作符,分别是:and.or.not. and:且,所有人为真才为真. or:或,一个为正就是真. not:非,取反. >>> print(3>2 ...
- php逻辑操作符中&和&&的异同
php有5种算术操作符(+ - * / %),6种赋值操作符(+= -= *= /= %= .=),8种比较操作符(=== < > <= >= != <> !==) ...
- Linux Shell脚本逻辑操作符简介
在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...
- 逻辑操作符---Lua: and,or,not 对比 C++:&&,||,!
lua中有三个逻辑操作符:and,or,not(逻辑与,逻辑或,逻辑非),同样c++也有类似的三个逻辑操作符:&&,||,!(逻辑与,逻辑或,逻辑非).他们的运算对象就是真和假.lua ...
- 你好,C++(17)0.1*10不等于1.0——4.1.4 关系操作符4.1.5 逻辑操作符
4.1.4 关系操作符 在C++中,除了需要用算术操作符对数据进行加减乘除的算术操作之外,我们有时候还需要对数据之间的关系进行操作,也就是对两个数据进行大小比较,得出它们之间的大小关系.在现实世界中 ...
- Javascript赋值语句中的“&&”操作符和"||"操作符
有这么一种常见的语句: var a = a || 4; 那赋值语句中的"&&"操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数 ...
- shell 的条件表达式及逻辑操作符简单介绍
查看系统的shell: cat /etc/shells 文件测试表达式: -f 文件 文件存在且为普通文件则真,即测试表达式成立. -d 文件 文件存在且为目录文件则真,即测试表达式成立. -s ...
- shell 中的操作符
1.算术操作符 2.关系操作符 3.布尔操作符 4.字符串操作符 5.文件相关操作符 算术操作符 bash shell 没有提供任何机制来执行简单的算术运算,不过我们可以借助于一些其他程序,如 exp ...
- 《C++ Primer Plus》读书笔记之四—分支语句和逻辑操作符
第六章 分支语句和逻辑操作符 1.&&的优先级低于关系操作符. 2.取值范围:取值范围的每一部分都使用AND操作符将两个完整的关系表达式组合起来: if(age>17&& ...
随机推荐
- [转]ORACLE优化器RBO与CBO的区别
RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...
- CSRF——跨站请求伪造
一.CSRF是什么CSRF,全称:Corss-site request forgery,中文名称:跨站请求伪造.CSRF攻击比XSS攻击更具危险性,被安全界称为“沉睡的巨人”. 二.CSRF可以做什么 ...
- Hangfire(任务调度)
官网:hangfire.io 简单用法: 1.放入job BackgroundJob.Enqueue<IIMService>(c => c.SendBatchSmsByIm(read ...
- art-template补充
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- 【转载】Spring bean 中 constructor-arg属性
转载地址:https://blog.csdn.net/qq_27292113/article/details/78063696 方便以后查阅
- mysql的一些基本常识
1.主键的选取 主键的字段不能有null存在 主键应该使用bigint自增,而不是int 主键的选取默认为id 联合主键:就是多个字段被设置为主键,这里主键字段的值是允许相同的,只要不是所有字段相同即 ...
- categorical_crossentropy VS. sparse_categorical_crossentropy
From:https://jovianlin.io/cat-crossentropy-vs-sparse-cat-crossentropy/ categorical_crossentropy 和 sp ...
- JVM、JRE、JDK的区别
什么是Java虚拟机(JVM)?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...
- List接口和Set接口及其常用实现类概述
一.List接口 List:有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元 ...
- [原创] Delphi InputBox、InputQuery函数
Delphi InputBox.InputQuery函数 两个函数都是弹框提示输入信息 function InputQuery(const ACaption, APrompt: string; var ...