c++编程拾贝(二)
2016-03-22 02:44
246 查看
关于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()); }
相关文章推荐
- C++中的值传递 | 指针传递 | 引用传递
- 八大排序之直接插入排序
- 冒泡排序
- 选择排序
- C++的四种cast操作符的区别--类型转换
- Lotto 迭代算法 cpp
- 【动态顺序表】 c语言的动态顺序表
- C语言线性表的简单创建和操作
- 【顺序表】 c语言的顺序表
- 初级C++1--面向过程
- 初级C++2类与对象
- Effective C++: 绝对不要重定义一个继承而来的非虚函数.
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- C++添加一个头文件和extern以及全局变量和局部变量问题(16.3.19上机的一小题)
- C++的重载(overload)与重写(override)
- Problem B: C语言习题 学生成绩输入和输出
- c语言:单链表的实现(一) 创建,插入,删除,查找
- C语言习题 计算该日在本年中是第几天
- c语言:多项式相加的实现
- 【C++】编程小结②-- 字符串&定义变量