const 限定符

来源:互联网 发布:java log4j使用实例 编辑:程序博客网 时间:2024/05/29 13:45

一条声明语句通用的描述是,由一个基本数据类型(base type)和紧随其后的一个声明符(declartor)列表组成。每个声明符命名了一个变量并指定改变量为与基本数据类型有关的某种类型。例如:

int *p;
基本数据类型是int,声明符列表是*p。这表示p是个指针,指针指向的数据类型是int。

int *&r=p;
基本数据类型是int,声明符列表是*&p。从右往左看,首先&r表示r是对某个东西的引用,*&r表示r是对指针对象的引用,指针指向数据为int。总的来说r一个对指针p的引用

const 限定符

const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。

const 的引用

把引用绑定到const对象上,称之为对常量的引用(reference const)。简称为常量引用
常量引用初始化是引用中的特例。正常引用初始化中引用的类型必须与其引用对象的类型一致,而对常量引用允许初始化绑定非常量的对象、字面量,甚至是个一般表达式。
int i = 42;const int &p1 = i;const int &p2 = 11;const int &p3 = p1 * 3;
常量引用可以引用一个非cosnt的对象。例如p1。因为常量引用仅对引用可参与的操作做出限定,对于引用的对象本身是不是一个常量未限定。

指向常量的指针

类似常量引用,指向常量的指针(pointer to const)不能用于改变其所指对象的值,但它可以指向常量或非常量。
int temp1;int *a=&temp;const int *p1=a;
要想存放常量对象的地址,只能使用指向常量的指针。
cosnt int b=2; const int *p2=&b;
指向常量的指针没有限制指针本身值不能改变,也没有限定指向的对象不能通过其他途径改变。
p=a;*a=11; //*p也同时改变

const指针

指针也是对象,可以用cosnt修饰,称为指针常量(const pointer)。指针常量必须初始化,而且一旦初始化完成,它的值(也就是存放在指针中的那个地址)就不能在改变。
int a=0;int *cosnt p=&a;
基本数据类型是int,声明符列表是*cosnt p从右往左看,首先cosnt  表示p存储的值不能改变,接着*表示p是个指针,指针指向的数据类型是int。总的来说p就是一个指向int类型的常量指针。

顶层cosnt 与底层cosnt

对于指针来说,指针本身是个对象,又可以指向另一个对象。
用名词顶层const(top-level const)表示指针本省是个常量。(更一般表示任意对象是常量)
用名词底层const(low-level const)表示指针所指的对象是一个常量。(跟一般表示跟指针和引用等复用类型的基本类型部分有关)
int i=0;int *const p1=&i;
这是顶层const,因为不能改变p1值,它是个常量。
const int a=42;
这是顶层const,因为不能改变a值,它是个常量。
const int *p2=&a;
这是底层const,因为可以修改p2值。
const int *const p3=p2;
靠右边的是顶层const,靠左边的是底层const。
const int &r=a;
用于声明引用的const 都是底层const。因为常量引用不能改变值。