c++编程拾贝(二)

关于const那些事

晚上看c++编程思想,看到一些很有趣的东西,记录下来,在旁边的批注上写了两个大字,牛逼。

c和c++那些有数值但是不会放在内存区域的东西

c中,存在一种定义,他不会分配空间给这个变量,那就是预处理的define:

#define MAX 65536

例如上面的代码,作为一种文本替代的预处理,当然不会分配地址空间给MAX,而c++中更佳鼓励的方法是这样写一个“只在这里改,可以在全局用“的变量:

const int max = 65536;

这么做的原因主要在c中define预处理只是文本的替代,并不做类型检查,因此很容易发生问题。而c++这么做必需经过编译器的检查,因此更加安全些。

定义在需要用到的头文件处或者在全局区域定义,并且该值不会放在内存区域,只会放在它(max)的符号表里,但是有一个更意外的事情是,如果在其它头文件中用了如下:

 extern const int max;

extern关键字告诉编译器这个东西在别的地方,让编译器放行,在别的地方这个要求也强制要求了该max需要有一个地址(其实也就是说如果你对那个max取址的话也是会分配一块地址的),深夜看到这段话真是将栏杆拍遍。

常量折叠(constant folding)

来自thinking in c++的一个概念,指的是编译器对常量表达式的化简优化处理,即在有常量表达式的地方将常量表达式展开成最简的过程。上面的const类型的变量说是不会分配内存也是常量折叠搞的鬼啦。

因为难免要分配内存,因此const定义必须为内部连接(但是问题是c中const被引入的时候当作了外部连接),即连接仅在特定的编译单元内部,不会发生垮文件的连接问题,也即不会发生重定义的问题。

大部分的内建数据类型的情况,编译器都能执行常量折叠。

上面说到的c中的const是外部连接,举个例子就是:

const int num;

这在c中是合法的,它只是一个申明,指明在别的地方num会有定义,而在c++中这是非法的,一个const值必需在申明的时候就指定。

c中const是必需分配内存的,而c++就像上面说的,实际上一开始是不会分配内存的,只是存在字符表中.

下面看一段有趣的代码:

    const int i = 100;
    const int j = i + 10;
    char buf[j] = { "a" };
    for (int i = 0; i < j; ++i)
    {
        cout << buf[i] << endl;
    }

另一段:

    int i = 100;
    const int j = i;
    char buf[j] = { "a" };
    for (int i = 0; i < j; ++i)
    {
        cout << buf[i] << endl;
    }

第一段不会有问题,第二段编译器会报错的,我想如果有了上面的知识应该就会明白原因了。

当然,强制一个const成为外部连接让其它文件可以使用,那就强迫分配内存,像这样:

extern const int x = 1;

下面讲讲const 和 临时量

看一段代码,来自c++编程思想,今天有点晚了,明天我再详细讨论这个代码。
这是一段很有意思的代码,可挖掘的东西很多,就当是一个笔试挑错题吧~

Class X{
int i;
 public:
     X(int ii = 0);
     void modify();
};

X::X(int ii){ i = ii;}

void X::modify(){ i++;}

X f5(){
    return X();
}

const X f6(){
    return X();
}

void f7(X& x){
    x.modify();
}

int main(){
    f5() = X(1);
    f5().modify();
    f7(f5());
    f6() = X(1);
    f6().modify();
    f7(f6());
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值