zoukankan      html  css  js  c++  java
  • 关于operator void* 操作符

    在《大规模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++程序设计这本书所说,对于不了解类设计的人。理解起来比较费劲。

      因此要慎重考虑。

  • 相关阅读:
    #研发中间件介绍#定时任务调度与管理JobCenter
    分享一个分布式定时任务系统 ( python)
    APScheduler + Gearman 构建分布式定时任务调度-std1984-ITPUB博客
    分布式缓存的一起问题 – 后端技术 by Tim Yang
    新兵训练营系列课程——Feed架构介绍
    Mysql分库分表方案
    可扩展性设计之数据切分
    你的数据库数据量上亿,为了提高效率,要分库还是分表?具体怎么做
    58同城mysql分库分表实践-沈剑
    可动态扩展的分库分表策略浅谈
  • 原文地址:https://www.cnblogs.com/songr/p/5224115.html
Copyright © 2011-2022 走看看