在《大规模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. Echarts 图表的本地配置

    前言 Echarts是一个美观的可视化工具,但是很多朋友初次接触,不知道自己该怎么创建一个包含Echartst图表的本地HTML网页,本文将详细地介绍Echarts的使用流程. 使用流程步骤 共分为三 ...

  2. vue中使用axios下载文件,兼容IE11

    一.设置axios返回值为blob 二.使用a标签的down属性下载,如果是IE浏览器,可以使用navigator.msSaveBlob进行下载 // data的数据类型是blob downloadF ...

  3. idea查看一个接口的子接口或实现类的快捷键

    ctrl+h 先选中类或接口,再按ctrl+h

  4. service 方法和doGet、doPost方法的区别

    Service方法和doGet和doPost方法的区别service:     可以处理get/post方式的请求,如果servlet 中有service方法,会优先调用service方法进行处理do ...

  5. Navicat连接Oracle数据库用户权限问题

    解决Navicat连接Oracle数据库用户权限问题: 第一步:在cmd窗口运行[sqlplus], 第二步:输入Oracle的用户名和口令连接Oracle数据库, 第三步:执行授权代码,给用户授予D ...

  6. Python【BeautifulSoup解析和提取网页数据】

    [解析数据] 使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子 在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据 [提取数据]是指把我们需要的数据从众多数据中挑 ...

  7. WUSTOJ 1277: 小吉吉读书(Java)

    1277: 小吉吉读书 题目   有一本 n 页的书,每天都看 ai 页,已知星期 k 买的书,问星期几能看完?更多内容点击标题. 分析   统计出一个星期能看 a 页,看了 a 页又会回到买书的那一 ...

  8. 【转】利用匿名namespace解决C++中重复定义的问题

    目录 利用匿名namespace解决C++中重复定义的问题 原文:https://blog.csdn.net/pi9nc/article/details/11267031 利用匿名namespace解 ...

  9. CI/CD/Jenkins

    Continuous Integration, Continuous Delivery & Deployment (CI/CD) 持续集成.持续部署&持续交付. Jenkins就是一个 ...

  10. 怎样理解window.name

    window.name表示当前窗口的名字, 而非网页的名字, 网页的名字需要使用: document.title; window.name一般是空的字符串, 他的作用其实是配合配合超链接和表单的tar ...