在《大规模C++程序设计》这本书中谈到了迭代器模式。

他提供了这样的一个迭代器的例子

 

 

这个for循环中判断终止的写法,有点意思,做一下记录。

这个地方的本质是这样的:C++ 编译器,将it 转换为 (void*)it 观察是否是非0值。

之所以能转换,是因为重载了 void* 操作符。

 

  • 用vs新建一个win32控制台工程
  • 代码如下,代码将无法编译

// operatorTest.cpp : 定义控制台应用程序的入口点。

//

 

#include
"stdafx.h"

#include
<iostream>

using
namespace std;

class CTest

{

 

public:

 

};

 

 

int _tmain(int argc, _TCHAR* argv[])

{

    CTest t;

 

    if (t)

    {

        cout<<"true"<<endl;

    }

 

    return 0;

}

 

会有错误提示如下

 

  • 修改CTest

// operatorTest.cpp : 定义控制台应用程序的入口点。

//

 

#include
"stdafx.h"

#include
<iostream>

using
namespace std;

class CTest

{

public:

 

    operator
void*()

    {

        return
this;

    }

};

 

 

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
"stdafx.h"

#include
<iostream>

using
namespace std;

class CTest

{

public:

    int d_Value;

    CTest()

    {

        d_Value = 0;

    }

 

    operator
void*()

    {

        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* 操作符的更多相关文章

  1. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  2. C++ operator overload -- 操作符重载

    C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ...

  3. 浅谈Javascript中的void操作符

    由于JS表达式偏啰嗦,于是最近便开始采用Coffeescript来减轻负担.举个栗子,当我想取屋子里的第一条dog时,首先要判断house对象是否存在,然后再判断house.dogs是否存在,最后取h ...

  4. Javascript中void操作符

    Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. void操作符用法格式如下:1.javascript:void (expression)2.javascript ...

  5. 【Java】Operator 运算符/操作符

    Operator 运算符/操作符 什么是操作符? 一个表示特定的数学或逻辑操作的符号 算术运算符 加 + 减 - 乘 * 除 / 取模 % 前置自运算 ++ a .--b 后置自运算 a++ .b-- ...

  6. operator= 复制操作符的意外

    首先,看以下的代码的输出时什么: 上述代码做了最理所当然的事.就是将Derived的两个对象进行了交换.可是通过指针进行的赋值输出却不是预期的: 居然调用的是Base的operator=,也就意味着我 ...

  7. C# to IL 5 Operator Overloading(操作符重载)

    Every operator overload that we use in C#, gets converted to a function call in IL. Theoverloaded &g ...

  8. operator函数操作符

    函数操作数() 可以实现将对象当函数使用. class Square{ public: double operator()(double x)const{return x*x;} };

  9. C++重载操作符operator

    operator是C++关键字,用于对C++进行扩展: 1.可以被重载的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,> ...

随机推荐

  1. linux SSH 隧道

    一 什么是SSH隧道 首 先看下面这张图,我们所面临的大部分情况都和它类似.我们的电脑在右上角,通过公司带有防火墙功能的路由器接入互联网(当然可能还有交换机什么的在中间连 接着你和路由器,但是在我们的 ...

  2. S1. Android 功能大全

    [概述] 这篇文章主要描述安卓开发中可能实现的功能点. [准备工作] IDE:Android Studio,简单操作 如何创建一个 Android 项目 Android 项目结构分析 Androidm ...

  3. 【51nod】1776 路径计数

    [51nod]1776 路径计数 我们先把前两种数给排好,排好之后会有\(a + b + 1\)个空隙可以填数,我们计算有\(k\)个空隙两端都是相同字母的方案数 可以用枚举把第二种数分成几段插进去来 ...

  4. java日志框架系列(6):logback框架encoder详解

    1.Encoder 1.encoder功能 Encoder 负责两件事,一是把事件转换为字节数组,二是把字节数组写入输出流. 注意:在logback 0.9.19 版之前没有 encoder. 在之前 ...

  5. ExtensionLoader

    ExtensionLoader 从上图中看到该类的构造方法被私有化,并且提供了一个静态方法来获取实例对象, 是的,该类使用了单例模式,懒汉模式 ConcurrentMap<Class<?& ...

  6. poj 2915

    #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> ...

  7. (二十九)JSP之国际化

    导入 <%@ taglib url="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 创建三个语 ...

  8. (一)Centos之VMware虚拟机安装

    一.下载 64位的VM12 安装包: http://pan.baidu.com/s/1bpzoXQZ 二.安装 点击下一步: 老规矩,打勾,下一步: 这里我们新建一个文件夹 VM12 最好放在D盘或者 ...

  9. (十一)mybatis之整合ehcache缓存

    一.二级缓存 大家都知道使用mybatis就要先获取sqlsessionfactory,继而使用sqlsession来和数据库交互,每次只需要使用sqlsession对象提供的方法就好,当我们需要第一 ...

  10. SQL优化中的重要概念:阻塞

    原文:SQL优化中的重要概念:阻塞 上一篇讲到锁定的概念,那么接下来就是如何找到由于锁定而发生阻塞的进程,并解决阻塞问题. 1.会话1,修改数据,但没有提交事务 BEGIN TRAN select @ ...