博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
旧代码中的"enum hack"
阅读量:4311 次
发布时间:2019-06-06

本文共 1960 字,大约阅读时间需要 6 分钟。

本节课主要说明:

 

我们可以把

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(i[1000] = "<
<

输出: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
(this)->i++;}int main(){ const Y yy; yy.f(); //Actually changes it}

2、关键字mutable

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

  //详细请看关键字mutable

转载于:https://www.cnblogs.com/wiessharling/archive/2013/04/03/2998811.html

你可能感兴趣的文章
数据结构整理
查看>>
4基本动画
查看>>
10个小技巧助您写出高性能的ASP.NET Core代码
查看>>
JavaScript中的 JSON 和 JSONP
查看>>
字符串相关工具类
查看>>
iOS:图标尺寸
查看>>
项目冲刺,20151118
查看>>
O055、Detach Volume 操作
查看>>
MyBatis学习(3)
查看>>
otrs离线部署
查看>>
spring ioc原理(看完后大家可以自己写一个spring)
查看>>
[codevs 1039]数的划分
查看>>
【会议记录】第一次例会(9.22)记录
查看>>
SpringBoot与缓存
查看>>
java内存分析
查看>>
current_date与sysdate区别
查看>>
流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!
查看>>
Android源码解析01:下载Android源码
查看>>
NodeJS05
查看>>
Windows10更新后,远程桌面无法登录服务器 提示远程桌面协议 CredSSP 出现漏洞
查看>>