您的位置:首页 > 编程语言 > C语言/C++

C++常量const

2013-10-17 20:22 176 查看
C++中引入const 关键词 最初的动机是取代预处理其#defines 来进行值替代。其在用于指针,函数变量,返回类型,类对象以及成员函数的用法各不相同。

#define 所定义的常量没有类型,只在预处理期间存在,不占用存储空间。 会产生一些很难发现的错误。因此C++引入了const来消除这些问题。

const常量的存储空间:

通常C++编译器并不为const创建存储空间,将其定义保存在符号表中。当定义一个const时,必须为其赋上一个值

eg:const int bufsize=200;

如下几种情况例外:

1. const的定义一般在定义过的文件中才可见(内部连接),但是可以用extern来声明其他文件中定义的const值。

eg;extern const int bufsize;

此时,const由内部连接转变为外部连接,同时,编译器必须要为该常量分配存储空间。

2. 如果要取一个const的地址,编译器必须为该常量分配存储空间。

3.const用于集合,为了保证编译器不将一个结合保存到符号表中,所以必须为其分配存储空间

const的作用:

1.代替#define的常数表达式

2.表示该值在其生命周期中不可改变,如果程序试图改变它,编译器将报错。

const用于集合:

如 const int i[]={1,2,3,4};

在这种情况下,const 意味着不能改变的一块存储空间,但是不能在编译期间使用它的值,编译器不知道该不能改变的存储空间中的存储内容。

数组定义 如: float f[10],其中[]中的数必须是编译器所知道的常量。所以float f[i[2]] 是非法的。

const指针:

const int *u

int const *u; 如上两种指针的定义表示"u 是一个指针(变量),它指向一个int常量",(指针可以移动) u=&c 是合法的。 *u=2 是不合法的

而 int *const u= &a. 表示u一个常量指针,它指向一个int变量。(地址不变,地址中的内容可以变),*u=2 是合法的。u=&d是不合法的

函数参数和返回值

传递和返回值:

void f1(const int i){...} i在函数体内不能被改变。他是函数创造者的工具,对于函数调用者是隐式的。

const X g() 返回值不能作为左值 g()=X是不合法的。没有多大意义,没人会这么写。

传递和返回地址:

如果传递或返回一个地址(指针或引用)客户程序取地址并修改其初值是可能。有时需要阻止。采用const,如:

void u(const int *cip);

const char *v();

类中的const:

类中的(非static)const的含义是:”在类的一个对象的生命周期中它是一个常量“,该const在构造函数中初始化。

eg:

class A{

private:

const int size;

public:

A(int sz): size(sz){}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: