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&& ...
随机推荐
- vue.js(09)--v-for中的key
v-for中key的使用注意事项 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- 一、WebApi模型验证实践项目使用
一.启语 前面我们说到,模型验证的原理(包含1.项目创建,2.模型创建,3.走通测试模型验证,4.在过滤器中处理返回json格式(非控制器内))-完全是新手理解使用的,新番理解 通常情况下,对于那些经 ...
- 五 shell 变量与字符串操作
特点:1 shell变量没有数据类型的区分 2 Shell 把任何存储在变量中的值,皆视为以字符组成的“字符串”. 3 设定的变量值只在当前shell环境中有作用 4 不能以数字开头 ...
- 01.基础架构:一条SQL查询语句是如何执行的?学习记录
01.基础架构:一条SQL查询语句是如何执行的?学习记录http://naotu.baidu.com/file/1c8fb5a0f2497c3a2655fed89099cb96?token=ff25d ...
- Ansible用法playbook
playbook文件 hello.yml --- - name: test_tasks [各个任务的总描述] hosts: webserver remote_user: root gather_fac ...
- jsonp跨域获取数据实现百度搜索
本菜鸡最近在写某个页面请求数据时,报了如下的错误. Failed to load https://...:No 'Access-Control-Allow-Origin' header is pres ...
- 洛咕P4180 严格次小生成树
鸽了很久的一道题(?)貌似是去年NOIP前听的emm... 首先我们分析一下最小生成树的性质 我们kruskal建树的时候呢是从小到大贪心加的边,这个的证明用到拟阵.(我太菜了不会) 首先我们不存在连 ...
- 20_1.Condition
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...
- Code Review怎样做好
一.背景 最近随着交易业务快速扩展,研发组内新项目及新成员越来越多,如何做好Code Review,把控研发人员开发代码质量很是关键. 对于大部分业务团队,谈到Code Review就会面露哀状: ...
- thinkphp 配置格式
ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式. PHP数组定义 返回PHP数组的方式是默认的配置定义格式,例如: //项目配置文件 return [ // 默认模块名 'd ...