C++ const使用

C + +中的c o n s t默认为内部连接,也就是说,c o n s t仅在c o n s t被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到。当定义一个常量(c o n s t)时,必须赋一个值给它,除非用e x t e r n作了清楚的说明:
extern const bufsize;

虽然上面的e x t e r n强制进行了存储空间分配(另外还有一些情况,如取一个c o n s t的地址,也要进行存储空间分配),但是C + +编译器通常并不为c o n s t分配存储空间,相反它把这个定义保存在它的符号表里。当c o n s t被使用时,它在编译时会进行常量折叠。也就是说,编译器在编译时可以通过必要的计算把一个复杂的常量表达式缩减成简单的。

 

c o n s t可以用于集合,但编译器不能把一个集合存放在它的符号表里,所以必须分配内存。
在这种情况下,c o n s t意味着“不能改变的一块存储”。然而,其值在编译时不能被使用,因为
编译器在编译时不需要知道存储的内容。

const int a[] = {1,2,3};

float f[a[1]]; //非法

 

C编译器不能把c o n s t看成一个编译期间的常量。在C中,
如果写:
const bufsize=100;
char buf[bufsize];
尽管看起来好像做了一件合理的事,但这将得到一个错误结果。因为b u f s i z e占用存储的某个地
方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:
const bufsize;
这样写在C + +中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地方有存储
分配。因为C默认c o n s t是外部连接的。

 

指向const的指针

const int* x;
从标识符开始,是这样读的:“x是一个指针,它指向一个const int。”这里不需要初始化,因为
说x可以指向任何东西(那是说,它不是一个c o n s t),但它所指的东西是不能被改变的。

 

int* const x=&d;
现在它读成“ x是一个指针,这个指针是指向i n t的c o n s t指针”。因为现在指针本身是c o n s t指针,
编译器要求给它一个初始化值,这个值在指针寿命期间不变。然而要改变它所指向的值是可以
的,可以写* x = 2;

 

临时变量通过引用被传递给一个函数时,这个函数的参数一定是常量(c o n s t)引用。

void f(X&x);

void g(const X&x);

X x = new X();

f(x); //非法

g(x);//合法

 

编译期间类里的常量
因为在类对象里进行了存储空间分配,编译器不能知道c o n s t的内容是什么,所以不能把它
用作编译期间的常量。这意味着对于类里的常数表达式来说,c o n s t就像它在C中一样没有作用。
我们不能这样写:

 

class food{

  const int SIZE=100;

  int a[SIZE];  //非法

...

 

  在类里面要使用常量可以使用enum,使用e n u m是不会占用对象中的存储空间的,枚举常量在编译时被全部求值

class food{

   enum{SIZE=100};

  int a[SIZE]; //合法

 

 

一个类如果是const,那这个类只能调用const的成员函数,非const的成员函数调用会产生编译时错误,要想在const成员函数里面改变成员变量的值,可以将成员变量定义为mutable

class Y{
	int i;
	mutable j;
public:
    Y();
    void f() const;
};

void Y::f() const{
	i++;  //非法  const成员函数不能改变成员变量的值 
	j++;  //合法  const成员函数可以改变mutable成员变量的值 
}
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值