【C++】变量(六) 常变量

本文探讨了程序设计中常见的问题——幻数,并提出了解决方案。通过将具体数值赋给变量并标记为常量,提高了代码的可读性和可维护性。同时介绍了常变量的正确使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们来看一个程序片段:

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是外来的(调用过来的)变量,并不能对它进行初始化操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值