在《大规模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. QtCreator中打开.ui文件时卡死崩溃的解决方法

    问题 QtCreator中打开一个项目,在编辑器中打开普通的.cpp或.h等文件正常,构建正常,运行正常,但是打开ui文件(QtCreator自动调用designer)时会卡死然后崩溃退出. 解决方法 ...

  2. CentOS 7 安装wordpress

    1.安装php 要安装php 7,必须使用下面的命令在Centos7系统上安装并启用epel和remi存储库. 输入一下代码, yum install http://rpms.remirepo.net ...

  3. [CF293B]Distinct Paths_搜索_剪枝

    Distinct Paths 题目链接:http://codeforces.com/problemset/problem/293/B 数据范围:略. 题解: 带搜索的剪枝.... 想不到吧..... ...

  4. python3 获取自建gitlab用户提交信息

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019-12-03 14:20 # @Author : Anthony # @Emai ...

  5. LIUNX随堂学习-1 用户及查看信息

    1.useradd   #创建用户             例如:useradd ljj     创建一个名为ljj的用户 2.userdel -r    #删除用户         例如:userd ...

  6. 03 HttpServletRequest_HttpServletResponse

    HttpServletRequest:一次来自客户端的请求的相关信息 请求行 request.getMethod() 获取http请求方式 request.getRequestURI() 获取统一资源 ...

  7. js:把字符串转为变量使用; js下将字符串当函数去执行的方法

    1 把字符串当变量使用 通过计算 string 得到的值(如果有的话).该方法只接受原始字符串作为参数 demo: var type = "car"; var newStr = & ...

  8. 解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式

    错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 的出现,意味着项目需要xml文件来 ...

  9. PHP运行机制和原理

    以echo "Hello World";为例 经历五个步骤:1.扫描(scanning):先进行语法分析和词法分析,然后将index.php内容变成一个个语言片段(token ar ...

  10. 轻松搭建CAS 5.x系列(7)-在CAS Server使用第三方帐号做认证

    概述说明 CAS除了使用自身数据库配置的帐号体系外,也可以使用第三方帐号来做认证. 比如实现如下类似的红色标注部分的登录效果: CAS自带了Facebook.GitHub.WordPress和CAS的 ...