常量const之一

1.const的最初动机是取代预处理器#defines来进行值替代:因为预处理器只做些文本替代,它既没有类型检查概念,也没有类型检查功能,所以预处理器的值替代会产生一些微小问题,这些问题在c++中可以通过使用const值而避免。

2.出一道笔试题目:

char * s = "AAA";

printf("%s",s);

s[0] = 'B';

printf("%s", s);

请问有什么问题?

在《thinking in c++》中是这么说的:“没有强调严格的const特性的地方,是字符数组的字面值。编译器接受char *s = ”AAA"而不报告错误。从技术上来讲,这是一个错误,因为字符数组的字面值是被编译器作为一个常量字符数组建立的,所引用该字符数组得到的结果是它在内存里的首地址。“


3.const在c++中与在c语言中是有区别的。在c中const的意思是”一个不可改变其值得普通变量“,const常量总是占用存储而且它的名字是全局符。这样c编译器不能把const看成一个编译期间的常量。在c中,

const int bufsize = 100;

char buf[bufsize];

这样写是错误的。

在c语言中可以这样书写: const int bufsize; 但在c++中时不对的。c编译器把它作为一个声明,指明在别的地方有存储分配,因为c默认const是外部链接的(c++默认为内部链接),所以这样做是合理的。在c++中要想完成与c中同样的事必须写成:extern const int bufsize;

在c++中,一个const不必创建内存空间,而在c中,一个const总是需要创建一块内存空间。

4.c++关于类型检查时非常精细的,可以把一个非const对象的地址赋给一个const指针,因为也许有时不想改变某些可以改变的东西。然而,不能把一个const对象的地址赋值给一个非const指针,因为这样做可能通过被赋值的指针改变这个对象的值。当然,总能用类型转换强制进行这样的赋值,但是这个不被提倡。

5.

int f3()  { return 1; }

const int f4() {  return 1; }

 

int main()

{

const int j = f3();

int k = f4();

}

以上都是正确的。

对于内建类型来说,按值返回的是否是一个const,是无关紧要的,所以按值返回一个内建类型时,应该去掉const,从而不使客户程序员混淆。当处理用户定义的类型时,按值返回常量是很重要的。如果一个函数按值返回一个类型对象为const时,那么这个函数的返回值不能是一个左值(即它不能被赋值,也不能被修改)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值