发布日期:2015-12-08 09:26 来源: 标签: 编程语言 C++教程 C++变量修饰符 声明C++常变量
本章我们主要学习C++中常变量定义、声明与修饰符,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学
首先我们来看一个程序片段:
for (int index=0; index!=512; ++index)
这个是一个典型的for循环,但是它有两个问题,都是因为把512作为循环上限所引起的。
第一个问题是可读性。我们无法理解,index为什么要和512来比较,这个512到底是个什么数呢?在C语言中,我们把这种没有明显意义的数字,称为幻数(magic number),也就是凭空出现的数。
第二个问题是可改性。假设这个512的数字出现了100次,其中80次是作为特定buffer的意义存在的,另外20次则是其他的一些意思。那么当我们需要把buffer的值改为1024的时候,我们需要找出这80个特定意义的“512”,再把它们都改成“1024”,这无疑是非常困难且繁琐的。
那么要如何解决这些问题呢?
这里我们可以用到一个变量,并把它的初始值设定为512,如下:
int buffer=512;
for (int index=0; index!=buffer; ++index)
可见,我们把这个512的值附加到变量buffer上后,我们只要修改很小的一段程序,即可完成目的。这样可以避免很多不必要的麻烦,而且可以降低错误的可能性。
—————————————————————————————————————————————————
常变量和常变量修饰符
在把一个常量附加到一个变量上后,还有一个很重要的隐患,那就是变量的值是可以改变的。那么我们在运用常变量时就应该给这个变量加上一个限定,让其编程只读的。在C++中,我们通过在定义的变量前加上const来完成这一限定。如下:
const int buffer=512;
这段语句中把buffer的初始值设定为512,buffer还是一个左值,但是已经不可修改了。任何对buffer的写入都会引起编译错误:
buffer=0;  //error: attemtp to write to const object
正因为不能在常变量定义后对其重定义,我们在定义一个常变量时,必须及时的为其进行初始化操作:
const std::string hi="hello!"; //ok: initialized
const int i, j=0;              //error: i is uninitialized const
—————————————————————————————————————————————————
常变量的定义与声明
当我们在全局作用域定义一个普通的变量时,它是可以被整个程序调用的。但是,如果我们定义的是一个常变量,不管它是在哪个作用域定义的,都是当前file的局部变量,只能在当前file内存在,不能被其他的file调用。
当然,我们可以通过一些方法来使得常变量成为可以被调用的全局变量,那就是为它加上extern:
extern const int buffer=fcn();  //file_1.cc; defines and initializes a const that is accessible to other files
extern const int buffer;    //file_2.cc; uses buffer from file_1
for (int index=0; index!=buffer; ++index)  //file_2.cc; uses buffer from file_1
在这段程序中,我们再file_1.cc中定义了一个常变量buffer,它的初始值是函数fcn的返回值。而且,我们在定义buffer时加上了extern,这样就把它变成了一个全局变量,使得它可以再file_2中声明和调用。
同样,我们可以看到,在file_2中我们声明常变量buffer时也使用了extern。需要注意的是,在这里的extern只是表明buffer是外来的(调用过来的)变量,并不能对它进行初始化操作。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。