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

c++

2015-12-09 20:23 267 查看
转载请标明出处:http://blog.csdn.net/zhangxingping

第七篇 更多的数据类型和运算符

本章我们又回到数据类型和运算符的话题上。除了目前我们使用过的那些数据类型之外,C++还支持几种别的数据类型,其中就包括对我们已经学过的数据类型的修饰符,还有包括枚举和类型定义的别的数据类型。C++中还提供了几种附加的运算符,这些运算符极大地扩展了编程任务的范围。这其中就包括位运算符,移位运算符号和sizeof运算符。

必备技能7.1:const和volatile 修饰字

C++中有两种可以影响变量访问或者修修改方式的限定字。它们就是const和volatile。通常,它们被称为CV限定字。

const

被const修饰的变量在程序执行期间其值是不能被修改的。因此,一个被const修饰的“变量”实际上并不是真正意义上的变量。但是我们还是可以给一个被const修饰的变量进行初始化的。例如:

const int max_users = 9;

就创建了一个名称为max_users的变量,其值为9。它可以像其他变量一样应用于任何的表达式。但是程序不能修改其值。

const最常用的就是被用来创建一个有名称的常量。通常,程序中出于不同的目的需要使用同一个值。例如,程序中可以还有多个大小一样的数组。在这种情况下,我们就可以使用一个被const修饰的变量来指明数组的大小。这种方式的优点就是如果以后需要修改数组的大小,我们只需要修改这个被const修饰的变量的值,然后对程序进行重新编译即可。而不需要在每个数组声明的地方都对其大小进行修改,并且这很容易引入错误。下面的程序演示了const的用法。

[cpp] view
plaincopy

#include <iostream>

using namespace std;

//创建一个常量,名称为num_employees,其值为

const int num_employees = 100;

int main()

{

int empNums[num_employees];

double salary[num_employees];

char *names[num_employees];

//...

return 0;

}

在上面的程序中,如果我们需要为数组指定新的大小,我们是需要修改声明变量num_employees的初始化值,然后重新编译即可。三个数组的大小就都会自动地变为新的值。

const的另外一个重要的用法就是防止通过指针来修改对象。例如,有时候我们需要避免在一个函数中对指针参数指向的对象进行修改。为了达到这个目的,我们只需要把指针参数声明为cont就可以了。这样就可以防止在函数中通过指针修改对象了。也即是说,如果指针参数前面用const进行修饰了,那么函数中的语句就不能通过该指针修改对象了。例如下面程序中的函数negate()返回的是其指针参数指向对象的相反数。这里就用到了const修饰指针参数,从而避免了在函数中通过指针修改对象的值。

[cpp] view
plaincopy

//使用常量指针参数

#include <iostream>

using namespace std;

int negate(const int *val);

int main()

{

int result;

int v = 10;

result = negate(&v);

cout << v << " negated is " << result;

cout << "\n";

return 0;

}

int negate(const int *val)

{

return -*val;

}

由于在上面的函数中val 被声明为是一个常量指针,所以函数negate()中就不能修改指针val指向对象的值。所以程序可以正常编译并运行。然而,如果我们把nagate()函数修改成下面的形式,则会在编译阶段就报告错误:

[cpp] view
plaincopy

//This won’t work!

int negate(const int *val)

{

*val = -*val;

return *val;

}

这里,程序企图修改指针val指向的对象的值。这样做是不可以的,因为val被声明为是const的。

const修饰符同样可以作用于引用参数,来防止函数修改引用参数的值。例如,下面版本中的negate()函数是错误的,因为它企图修改val引用的变量的值。

[cpp] view
plaincopy

//This won’t work!

int negate(const int &val)

{

val = -val; //错误,val引用对象不能被修改

return val;

}

volatile

修饰字volatile告诉编译器,被其修饰的变量可能会被程序中没有明确指定的方式被修改。例如,在定时中断处理程序中,我们可以传入一个全局变量的地址,每次定时中断后,处理程序就会更新该全局变量的值。在这种情况下,该全局变量的值就会在我们程序没有明确赋值的情况下被修改。变量被外部修改之所以对C++来说是特别重要的,是因为C++编译器经常会基于“如果变量没有出现在赋值运算符的左侧,则变量的值就没有改变”这种假设来对表达式进行优化。然而,如果超出了程序范围之外的因素如果导致变量的值被修改,则这种优化就会导致问题。为了避免这种问题的出现,我们必须在声明变量的时候使用volatile修饰字。如下:

volatile int current_users;

由于变量被volatile所修饰,每次我们在引用current_users的时候,它的值都会被重新获取。

练习:

1. 被const修饰的变量的值是否在程序中可以被修改?

2. 如果一个变量的值会被程序之外的事件处理所修改,我们应该如何声明这个变量?

存储类型说明字

C++中有5种存储类型说明字,它们是:

auto

extern

register

static

mutable

这些说明字告诉编译器如何存储变量。存储类型说名字是放置在变量声明的最前面的。其中的mutable说名字只能用于类对象,关于这点我们将在本书的后面进行介绍。

本章中,我们只对其它的说名字进行介绍。

auto

auto说明字用于声明一个局部变量。然而,它很少被用到。这是因为局部变量缺省地就是auto的。在程序中我们基本上看不到这个说明字。这个说明字是从C语言中继承而来的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: