zoukankan      html  css  js  c++  java
  • 旧代码中的"enum hack"

    本节课主要说明:

    我们可以把

    static const int size = 1000;替换为

    enum { size = 1000};

       

    在旧版的c++ 中,不支持在类中使用static const。这意味着const对在类中的常量表达式不起作用,不过,人们还是想得做到这一点。使用不带实例的无标记的enum(通常称为 enum hack)。例如下面代码:

    class Bunch
    {
        enum { size = 1000};
        int i[size];
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        cout<<"sizeof(Bunch) = "<<sizeof(Bunch)<<", sizeof(i[1000] = "<<sizeof(int[1000])<<endl;
        return 0;
    }

    输出:4000   4000   这说明了enum { size = 1000};并不占用内存
    所以,上面的例子说明了:

    我们可以把

    static const int size = 1000;替换为

    enum { size = 1000};

    2、const 对象和成员函数

    class X
    {
        int i;
    public:
        X(int ii);
        int f() const;
        int g();
        int ff() const;
    };
    
    X::X(int ii):i(ii)
    {
    }
    
    int X::ff() const
    {
        return i;
    }
    
    int X::g() 
    {
        i++;
        return i;
    }
    
    int X::f() const
    {
        ff();
        //g();  error 在f函数内都不能改变数据成员,函数g改变了数据成员i
        return i;
    }

    3、const 对象与const 成员函数或非const 成员函数
      

    class Quoter
    {
        int lastquote;
    public:
        Quoter();
        int lastQuote() const;
        const char* quote();
    };
    
    Quoter::Quoter()
    {
        lastquote = -1;
    }
    
    int Quoter::lastQuote() const
    {
        return lastquote;
    }
    
    const char* Quoter::quote()
    {
        //change the data member lastquote;
        //like 
        lastquote++;
        static const char* quotes[] = {"1", "", "2", "3", "4", "6"};
        return quotes[lastquote];
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Quoter q;
        const Quoter cp;
        cp.quote();//error   non const function
        
        cp.lastQuote();//ok
        q.lastQuote(); //ok 
        q.quote();     //ok
    
        int a;
        cin>>a;
        return 0;
    }

    构造函数和析构函数都不是const成员函数,因为他们在初始化和清除时,总是对对象作修改。

    要在const 函数中改变数据成员的方法:

    1、强制转换常量性:

      取this指针,并把强制转换成指向当前类型对象的指针。看来this已经是所需要的指针,但是,在const 成员函数内部,它实际上是一个const指针,所以,还应把它强制转换成一个普通指针。(ElementType*)this

    class Y 
    {
        int i;
    public:
        Y();
        void f() const;
    };
    
    Y::Y()
    {
        i = 0;
    }
    
    void Y::f() const
    {
         i++;  //error
         ((Y*)this)->i++;//OK
        (const_cast<Y*>(this)->i++;
    }
    
    int main()
    {
        const Y yy;
        yy.f();  //Actually changes it
    }


    2、关键字mutable

      在要修改的数据成员前加关键字mutable;

      //详细请看关键字mutable

  • 相关阅读:
    360多渠道打包
    美团多渠道打包
    友盟的多渠道打包
    在代码中得到应用的签名
    如何为APK签名?
    driver.close()和driver.quit()
    块级元素和行内元素
    selenium切换窗口
    pycharm快捷键
    类属性与方法(待补充)
  • 原文地址:https://www.cnblogs.com/wiessharling/p/2998811.html
Copyright © 2011-2022 走看看