Cpp_Basic---3/N(cpp的常量)

2016-12-30 09:54:07来源:oschina作者:OSer_Merlin人点击

说是常量, 这里主要针对const进行发散, 总结.

参考资料:


第一卷chapter8
const引入:

:



最初引入const就是为了进行"值替代", 把原来需要#define来处理的内容, 移交给了预处理器.



#define宏定义: 简单的文本替换, 没有类型检查, 没有作用于限定. (全局共享)


而Cpp引入的const值替代, 把预处理部分的工作, 移后到了编译阶段, 增加了类型检查 和作用域的限定.


但是const 引入的初衷还是 "值替代", 也就是说, 编译可能不会为其分配内存(也可能会), 这个后面验证.

对C的扩展&区别:

1. C中的const具有只读含义, 但是还是可以通过间接方式, 对其进行修改. 原因是C编译器对其分配了内存空间, 只要拿到了该块儿空间, 就可以进行修改.(直接用变量名字不行, 编译报错; 可以用非const指针)


除此之外, C中的const具有外部链接属性, 默认就是其他文件也可以使用(只要你包含该头文件).

2. C++中的const除了只读含义, 还有值替换的含义. 即 C++中的const 本质对应的是#define


如下面的代码:


const int buf_size = 10;
char buff[buf_size];

c99之前这段代码编译报错, 但是在c++03中, 这一句就能通过, 原因是cpp中的const确实可以在编译时进行常量替换或者计算常量表达式.(c语言要想这样用, 请定义一个宏吧, const就别想了)


并且默认是内部链接属性(存储在符号表中, 以key value对的形式), 就是文件作用域(只是在定义其的文件中可见, 其他文件不可见, 包含该头文件也不行), 如果你在函数中, 或者块儿中定义的const常量, 那么它的作用于就是函数&块儿. (相比之下, 宏定义却是全局的)


如果想在外部可见, 就要专门用extern关键字定义(注意定义的时候, 一定要初始化的; Cpp这样强制规定, 是为了区分定义和声明),


extern const int size = 10; /** <定义, 在该文件在编译时可以进行常量的替换或者常量表达式的求值*/
extern const int size; /**<声明, 表示外部文件(编译单元)引用别处定义的常量, 此时不能进行上面的 常量折叠 */

但是这样会导致, 除了符号表中有存储, 编译器还要单独为其开辟一段空间, 供外部编译单元使用. 此外取地址也会为其开辟空间, 请看下面的代码(以取地址, 就会为const常量分配空间为例) 验证:


#include
using std::cout;
using std::endl;
int main(void){

const int size = 10;
//int *ptr = (int*)&size;//c类型的强制类型转换
int *ptr = const_cast( &size); /*如果不进行强制类型转换, 编译报错*/
/*&size时就为符号表中的size分配的地址, */
/* (*ptr)和符号表中的size不是一个概念*/
cout <<"size = " << size << endl;
cout << "*ptr = " << *ptr <
cout << "-----------------------------"< *ptr = 9;
cout <<"size = " << size << endl;
cout << "*ptr = " << *ptr <
return 0;
}

运行结果是这样的:



cout<

但是*ptr则是去取得根据size这个const int分配出来的, 在全局区的一个地址的值;


(之后修改ptr所指向地址的值, 并不影响)



当然这种问题, 这样看是没有说服力的, 也看不到问题本质, 还是调试看看(或者看汇编代码)


(vc的话, 可以看到, 如何使符号表中的size, debug时看不到其内存地址; 仅仅当&size时才看到ptr指向的地址)

c VS cpp总结:

c中const是weak的, 请用#define宏吧;
c++中想用常量的地方就用const吧, 别再用啥宏了.

(当然一般工作中, 用enum和const替代宏是非常常用的, 我在高通的代码中看到好多)


C++中的const全解析:

上面说完了, c和cpp的区别&扩展, 下面谈一下, 只谈cpp中,const用于修饰指针, 引用, 函数参数, 返回类型, 类对象, 成员函数(等, 但是c11的constexptr不说)的一些细节, 权当累时, 解解倦意.


(晚上补上)

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台