在《大规模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. ubuntu desktop 登录root账户

    有一些操作,登录root账户比较方便,但是ubuntu桌面版默认不允许这样,需要更改root账户的默认密码才可以登录,解决方法是按以下顺序输入: sudo passwd <你现在的用户的密码&g ...

  2. Ubuntu下搜狗拼音输入法打不出汉字的解决方法

    问题 (1)Ubuntu下,搜狗拼音输入法能启动(系统托盘处有图标),但是打不出汉字,打字时选框不正常. 或者 (2)Deepin下,搜狗输入法无法启动,托盘处不显示图标,fcitx运行正常(这个可以 ...

  3. go基础系列 第二章 go指针

    一. 指针 先来看一段代码 var pa *int pa = &a *pa = fmt.Println(a) 这里定义了一个int类型的变量a, 有定义了一个指针类型的变量pa, 让pa指向了 ...

  4. HTML中,a href =" "和 a href ="#"的区别

    a href ="" 刷新当前页面,回到页面顶部a href ="#"不会刷新页面,回到页面顶部.浏览器地址栏网址后面会多显示1个#.

  5. Spring (1)框架

    Spring第一天笔记   1. 说在前面 怎样的架构的程序,我们认为是一个优秀的架构? 我们考虑的标准:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:就是可以做到,不断的增加代码,但是可以 ...

  6. JS 06 bom 框窗_页面_定时任务

    BOM(Broswer Object Model) 凡是 window 的属性和方法,均可以省略“window.” 方法: 框窗 1.警告框 window.alert("msg") ...

  7. ASP.NET Core分布式项目-2.oauth密码模式identity server4实现

    源码下载 这里根据<ASP.NET Core分布式项目-1.IdentityServer4登录中心>的代码来继续更新oauth密码模式,这里的密码模式比上次的客户端模式更安全 在WebAp ...

  8. (九)mybatis之延迟加载

    一.为什么要使用延迟加载? 使用延迟加载的意义 在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度快. 如果查询单表就可以满足需求,一开始先查询单表,当需要关联 ...

  9. 【原创】大叔经验分享(88)jenkins假死

    jenkins安装启动后,使用systemctl来进行进程监控 # systemctl enable jenkins 但是还是经常发生jenkins进程挂了,不会自动重启,通过systemctl查看状 ...

  10. GNU,GPL与自由软件

    GNU 是 Richard Stallman(理查德·斯托曼)创建的一个项目,not unix GPL(General Public License),GNU通用公共许可证.书面上的协议 自由软件与开 ...