c++之const限定符

来源:互联网 发布:如何查看电脑的mac地址 编辑:程序博客网 时间:2024/05/21 09:21

有时候我们希望定义这样一个变量,它的值不能被改变。为了满足这个要求,可以用const对变量的类型加以限定。
const限定符
(1):因为使用const限定符声明的变量就是常量,是不可以被修改的,所以在声明时必须进行初始化的。
(2):默认情况下,const限定的变量的作用域被设定为文件作用域。但是在某些时候,我们想多个文件共享const变量时,解决办法就是:对于const变量不管是声明还是定义都添加extern关键字。

const的引用
和普通引用不同,对常量的引用不能被用作媒介去修改它所绑定的变量。

const int  num = 1;    const int &num_quote = num;   //正确:引用及其对应的对象都是常量    num_quote = 12;               //错误:num_quote是对常量的引用    int  &num_quote1 = num;       //错误:试图让一个非常量引用指向一个常量对象

注意:
(1):对常量的引用必须是使用const限定符修饰的变量
(2):不允许通过对常量的引用去修改引用的目标对象
(3):在c++语言中,不允许随意改变引用所绑定的对象的,所以从这层意义上去理解所有的引用都算是常量。

c++中,引用的类型必须和其所引用的对象的类型一致,但是有两个例外,第一个例外就是在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果可以转换为引用的类型即可。

    double dval = 3.14;    const int & ri = dval;              //允许const的引用的类型和其对象的类型不同

其实绑定在ri上的对象还是一个int型,而不是double型的数据,因为上述代码在编译器变成如下形式:

cosnt int temp=dval;cosnt int & ri=temp;

在这种情况下,ri绑定了一个临时量,临时量就是当编译器需要一个空间来暂存表达式求值结果时临时创建的一个未命名的变量。因为我们规定const引用是不可以修改它绑定的那个对象的值的,所以其实就是我们不准去修改那个临时量,这也就是为什么const的引用可以使用任何表达式作为初始值。
对const的引用可能引用一个非const的对象,但是不可以使用const的引用去修改目标对象的值

int num = 4;const int & num1 = num;             //允许将const int &绑定到一个普通的int对象上。num1 = 9;                           //错误:不允许去修改目标对象的值

指针和const
指向常量的指针不能用于改变过其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针

    const double pi = 3.14;    double * ptr = π            //错误:ptr是一个普通指针    const double * ptr1 = π     //正确:ptr1可以指向一个常量    *ptr1 = 43;                   //错误:不能给*ptr1赋值

指针类型必须和其所指对象的类型一致,但是有 两个例外。第一个例外就是允许一个指向常量的指针指向一个非常量的对象。所谓的指针常量仅仅要求不能通过该指针改变其对象的值。

const指针
因为指针是一个对象,所以也可以把指针本身定义为常量,常量指针必须初始化(和其他常量是一样的),而且一旦被初始化,它的值(存放在指针中的地址)就不能改变。常量指针不变的是指针自己的值,而不是其对象的值

    int num = 0;    int * const num_pointer = #   //num_pointer一直指向num,    const int num1=2;    const int * const num1_pointer=&num1; //num1_pointer是指向常量对象的常量指针,也不允许通过num1_pointer去改变num1 的值

顶层const
名词顶层const表示指针本身是一个常量,而用名词底层const表示指针所指的对象是一个常量。顶层const可以表示任意的对象,用于声明引用的const都是底层const

0 0
原创粉丝点击