关于operator void* 操作符
在《大规模C++程序设计》这本书中谈到了迭代器模式。
他提供了这样的一个迭代器的例子
|
|
这个for循环中判断终止的写法,有点意思,做一下记录。
这个地方的本质是这样的:C++ 编译器,将it 转换为 (void*)it 观察是否是非0值。
之所以能转换,是因为重载了 void* 操作符。
- 用vs新建一个win32控制台工程
- 代码如下,代码将无法编译
|
// operatorTest.cpp : 定义控制台应用程序的入口点。 //
#include #include using class CTest {
public:
};
int _tmain(int argc, _TCHAR* argv[]) { CTest t;
if (t) { cout<<"true"<<endl; }
return 0; } |
会有错误提示如下
|
|
- 修改CTest
|
// operatorTest.cpp : 定义控制台应用程序的入口点。 //
#include #include using class CTest { public:
operator { return } };
int _tmain(int argc, _TCHAR* argv[]) { CTest t;
if (t) { cout<<"true"<<endl; }
return 0; } |
问题就解决了。解决的原因如开头所述,编译器将 if(t) => if((void*)t)
- 在实际应用中,当然不能像上述例子这样返回this,必须考虑,某个条件成立,返回非0值,否则返回0.
此次,我们修改CTest,让返回值与成员有关。
|
// operatorTest.cpp : 定义控制台应用程序的入口点。 //
#include #include using class CTest { public: int d_Value; CTest() { d_Value = 0; }
operator { if (d_Value < 100) return (void*)1; else return (void*)0; //或者返回NULL } };
int _tmain(int argc, _TCHAR* argv[]) { CTest t;
while(t) { cout<<"当前dvalue的值是:"<<t.d_Value++<<endl; }
return 0; } |
- 最后
重载操作符的使用,如大规模C++程序设计这本书所说,对于不了解类设计的人。理解起来比较费劲。
因此要慎重考虑。
|
|
关于operator void* 操作符的更多相关文章
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- C++ operator overload -- 操作符重载
C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ...
- 浅谈Javascript中的void操作符
由于JS表达式偏啰嗦,于是最近便开始采用Coffeescript来减轻负担.举个栗子,当我想取屋子里的第一条dog时,首先要判断house对象是否存在,然后再判断house.dogs是否存在,最后取h ...
- Javascript中void操作符
Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. void操作符用法格式如下:1.javascript:void (expression)2.javascript ...
- 【Java】Operator 运算符/操作符
Operator 运算符/操作符 什么是操作符? 一个表示特定的数学或逻辑操作的符号 算术运算符 加 + 减 - 乘 * 除 / 取模 % 前置自运算 ++ a .--b 后置自运算 a++ .b-- ...
- operator= 复制操作符的意外
首先,看以下的代码的输出时什么: 上述代码做了最理所当然的事.就是将Derived的两个对象进行了交换.可是通过指针进行的赋值输出却不是预期的: 居然调用的是Base的operator=,也就意味着我 ...
- C# to IL 5 Operator Overloading(操作符重载)
Every operator overload that we use in C#, gets converted to a function call in IL. Theoverloaded &g ...
- operator函数操作符
函数操作数() 可以实现将对象当函数使用. class Square{ public: double operator()(double x)const{return x*x;} };
- C++重载操作符operator
operator是C++关键字,用于对C++进行扩展: 1.可以被重载的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,> ...
随机推荐
- linux SSH 隧道
一 什么是SSH隧道 首 先看下面这张图,我们所面临的大部分情况都和它类似.我们的电脑在右上角,通过公司带有防火墙功能的路由器接入互联网(当然可能还有交换机什么的在中间连 接着你和路由器,但是在我们的 ...
- S1. Android 功能大全
[概述] 这篇文章主要描述安卓开发中可能实现的功能点. [准备工作] IDE:Android Studio,简单操作 如何创建一个 Android 项目 Android 项目结构分析 Androidm ...
- 【51nod】1776 路径计数
[51nod]1776 路径计数 我们先把前两种数给排好,排好之后会有\(a + b + 1\)个空隙可以填数,我们计算有\(k\)个空隙两端都是相同字母的方案数 可以用枚举把第二种数分成几段插进去来 ...
- java日志框架系列(6):logback框架encoder详解
1.Encoder 1.encoder功能 Encoder 负责两件事,一是把事件转换为字节数组,二是把字节数组写入输出流. 注意:在logback 0.9.19 版之前没有 encoder. 在之前 ...
- ExtensionLoader
ExtensionLoader 从上图中看到该类的构造方法被私有化,并且提供了一个静态方法来获取实例对象, 是的,该类使用了单例模式,懒汉模式 ConcurrentMap<Class<?& ...
- poj 2915
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> ...
- (二十九)JSP之国际化
导入 <%@ taglib url="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 创建三个语 ...
- (一)Centos之VMware虚拟机安装
一.下载 64位的VM12 安装包: http://pan.baidu.com/s/1bpzoXQZ 二.安装 点击下一步: 老规矩,打勾,下一步: 这里我们新建一个文件夹 VM12 最好放在D盘或者 ...
- (十一)mybatis之整合ehcache缓存
一.二级缓存 大家都知道使用mybatis就要先获取sqlsessionfactory,继而使用sqlsession来和数据库交互,每次只需要使用sqlsession对象提供的方法就好,当我们需要第一 ...
- SQL优化中的重要概念:阻塞
原文:SQL优化中的重要概念:阻塞 上一篇讲到锁定的概念,那么接下来就是如何找到由于锁定而发生阻塞的进程,并解决阻塞问题. 1.会话1,修改数据,但没有提交事务 BEGIN TRAN select @ ...



