operator bool()是什么

在C++中,operator TypeName()语法用来将对象转换为指定的TypeName类型,当这里TypeNamebool时,就可以直接在条件判断式里面直接用该对象:

#include <iostream>

class Foo {
public:
operator bool() const {
return true;
}
}; int main(int argc, const char* argv[]) {
Foo foo;
if (foo) {
std::cout << "true" << std::endl;
} return 0;
}

问题

operator bool()语法会遇到一些问题,比如隐式类型转换,还有相等测试无法检测书写错误:

#include <iostream>

class Foo {
public:
operator bool() const {
return true;
}
}; int main(int argc, const char* argv[]) {
Foo foo1;
Foo foo2;
// 这里==写成了=,但编译不会报错
if (foo1 = foo2) {
std::cout << "true" << std::endl;
} // 这里的隐式类型转换一般没有意义
bool flag = foo1; return 0;
}

隐式类型转换的问题可以在定义的时候加上explicit解决,和构造函数中的一样,赋值的时候只有显式类型转换才可以编译:

#include <iostream>

class Foo {
public:
// 加上explicit关键字
explicit operator bool() const {
return true;
}
}; int main(int argc, const char* argv[]) {
Foo foo1;
Foo foo2;
// 这里==写成了=,但编译不会报错
if (foo1 = foo2) {
std::cout << "true" << std::endl;
} // 隐式类型转换,编译错误
bool flag = foo1; return 0;
}

建议

个人还是觉得尽量不要用这种语法,还是像java那样写出特定名字的判断函数最好。C++也真是,搞这些复杂的语法太多了,反而影响语言使用者学习。

operator bool()是什么的更多相关文章

  1. C++ operator bool

    雕虫小技: #include <iostream> struct A{ operator bool(){ return false; } }; int main() { A a{}; if ...

  2. std::vector<bool>中的坑

    http://www.cplusplus.com/reference/vector/vector/?kw=vector C++中,vector<bool>为了达到节省内存的目的,专门做了特 ...

  3. c++中istream类型到bool类型的隐式转换

    事情的起因是见到了这种用法: while(cin>>m>>n&&m&&n) { } 现在分析一下,cin>>m>>n返回 ...

  4. 三值 bool? 进行与或运算后的结果

    bool? 实际上是 Nullable<Boolean> 类型,可以当作三值的 bool 类型来使用.不过三值的布尔进行与或运算时的结果与二值有什么不同吗? 本文内容 重载条件逻辑运算符“ ...

  5. 轻量级表达式树解析框架Faller

    有话说 之前我写了3篇关于表达式树解析的文章 干货!表达式树解析"框架"(1) 干货!表达式树解析"框架"(2) 干货!表达式树解析"框架" ...

  6. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  7. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备一)

    上节中提到在遍历创建控件树后,执行了以下操作:      1. CDialogBuilder构建各控件对象并形成控件树,并返回第一个控件对象pRoot:     2. m_pm.AttachDialo ...

  8. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  9. 《C++ Primer》学习笔记【第三部分 类设计者的工具】

    第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...

随机推荐

  1. leetcode刷题-55跳跃游戏

    题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 思路 贪心算法:记录每一个位置能够跳跃到的最远距离,如果 ...

  2. HTML标签语言一览表

    <html> ● 文件声明 让浏览器知道这是 html 文件 <head> ● 开头 提供文件整体资讯 <title> ● 标题 定义文件标题,将显示于浏览顶端 & ...

  3. python之Lambda

    Python 匿名函数lambda   lambda表达式在“:”后只能有一个表达式.也就是说,在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在py ...

  4. 串(string)

    题目描述 给定一个由小写字母组成的字符串s,每次你可以删去它的一个非回文子串, 求删成空串的最小次数. 输入输出格式 输入格式: 第一行一个整数 t 表示数据组数. 每组数据第一行一个整数 n表示字符 ...

  5. Oracle sqlplus中退格键、DEL键、上下左右键无法使用乱码问题

    功能描述:Oracle sqlplus中退格键.DEL键.上下左右键无法使用乱码 1.安装readline-8.0 ①下载readline-8.0.tar.gz文件,百度网盘下载路径: https:/ ...

  6. 数据库:浅谈DML、DDL、DCL的区别

    简介 SQL是一个标准的数据库语言,是面向集合的描述性非过程化语言.它功能强,效率高,简单易学易维护(迄今为止,我还没见过比它还好学的语言).然而SQL语言由于以上优点,同时也出现了这样一个问题:它是 ...

  7. python中的方向控制函数

    方向控制函数:控制海龟方向,包含绝对角度&海龟角度 改变海龟运行方向,让海龟转向 angle :改变行进方向,将海归运行方向改变为某一个绝对的角度 例如 将坐标系中的海龟方向改变为绝对系中的4 ...

  8. MybatisPlus根据模板生成器代码

    导读 网上的代码生成器,都不是自己想要的,今天下午研究了下,可以使用mybatisplus自定义模板,根据模板生成相应的代码,可以根据需求,改造相应模板即可.代码已上传github/百度云. 项目结构 ...

  9. 《Head First 设计模式》:状态模式

    正文 一.定义 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 状态模式允许一个对象基于内部状态而拥有不同的行为. 状态模式将状态封装成为独立的类,并将动作委托到代 ...

  10. 能否使用GHDL+GTKWave代替Quartus ii (续——vhdl_testbench_cli)

    vhdl_testbench_cli项目介绍 这是我放在gitee上的一个项目. 项目是用于Mac系统下生成vhdl testbench的工具. 主要就是续着这篇文章<能否使用GHDL+GTKW ...