C/C++ const几点总结(1)

1.const的最初动机是取代预处理器#define来进行值替代。被广泛用于指针、函数变量、返回类型、类对象已经成员函数

2.C++中的const默认是内部连接,也就是说const仅在const被定义过的文件才是可见的,而连接时不能被其他编译单元看到。当定义一个const时,必须赋一个值给她,除非用extern修饰说明


3.通常C++编译器不为const创建存储空间,相反它把这个定义保存在它的符号表里。但是当用extern修饰说明时,就强制进行了存储空间的分配(另外还有一些情况,如取一个const的地址,也要进行存储空间分配),由于extern意味着使用外部连接,因此必须分配空间,这也就是说有几个不同的编译单元能够引用它,所以它必须分配空间。

4.const可以用于集合,但必须保证编译器不会复杂到把一个集合保存到它的符号表中,所以必须分配内存,在这种情况下,const意味着“不能改变的一块存储空间”。然而,不能编译期间使用它的值,因为编译器在编译期间不需要知道存储的内容。这样,就能明白下面的代码是非法的

5.在C中const的意思是“一个不能被改变的普通变量”,const常量总是占用存储而且它的名字是全局符。这样,C编译器不能把const看成一个编译期间的常量。在C中,如果写:

是错误的,因为bufsize占用某块内存,所以C编译器不知道它在编译时的值。而这样写在C++中是正确的!!所以在C中使用限定符const不是很有用的,如果在常量表达式中(必须在编译时被求值)使用一个已命名的值,C总是强迫程序员在预处理中使用#define

6.在C中可以这样写

C编译器把它作为一个声明,指明在别的地方有存储分配。因为C默认const是外部连接的,所以这样做是合理的。而这样写在C++中是不对的,c++中const定义时必须初始化!C++默认const是内部连接的,这样如果在C++中想完成与C中同样的事情,必须用extern明确地把连接改成外部连接

7.C++中const默认是内部连接的,所以一个文件中定义的const,不能在另一个文件中使用extern引用过来,为了能够使const成为外部连接以便让另一个文件可以对它引用,必须明确的把它定义为extern,如:

注意,通过进行初始化并指定为extern,强迫的给它分配内存。初始化使它成为一个定义而不是一个声明,在C++中的声明:

意味着在别处进行了定义(在C中不一定这样)。现在就可以明白为什么C++中要求一个const变量定义时需要初始化:初始化把定义和声明区分出来(在C中它总是一个定义,所以初始化不是必须的)。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值