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

      因此要慎重考虑。

  • 相关阅读:
    悲悯心洞悉真相
    查看逍遥模拟器端口号
    delphi中Tstringlist分割字符串的用法
    delphi中httpencode使用注意事项
    DELPHI常用类型及定义单元
    左旋转字符串
    链表中倒数第k个节点
    二叉树镜像
    用两个栈实现队列
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/songr/p/5224115.html
Copyright © 2011-2022 走看看