1
九,const 量或不变量十、变量的引用 (C++特有 )
十一,typedef类型声明语句
2
九,const 量或不变量在变量或形参前冠以关键字 const,这样声明的量就具有了不易改变的性质,而系统保留其类型属性和作用域,
必要时保留地址属性。
前面提到的文字常数与符号常数不直接具备地址属性 (字符串常数占有数据区内存 )。
const关键字可以修饰变量也可以修饰类的对象,const
关键字修饰的量简称之为只读量或不变量或常量。
const是 C语言的关键字。 const量根据定义的格式不同可以细分为两种:第一种是静态的不变量或常量,另一种是活动的不变量或只读变量。
3
1,静态的常量静态的常量或不变量的定义的格式为:
const 类名 常量名 1=常数 1,常量名 2=
常数 2,...,常量名 n=常数 n;
const type constv1 =constant1,constv2 =
constant2,...,constvn = constantn;
静态的常量用一个具体的文字常数或用编译阶段可以求值的常数进行初始化。
4
例如,声明圆周率 pi为浮点不变量,数组大小
arraysize为静态的整型不变量:
float const pi = 3.1415926;
const int arraysize =80;
常数表达式是在编译阶段可静态求值的表达式。
常数表达式的操作数可以是整型常数、字符常数、浮点常数、枚举常数、静态的 const常量和 sizeof表达式。
例如:
3*5/2.0+6.0>3.1-sizeof (int)* arraysize
是常数表达式。
5
2,活动的不变量或只读变量活动的不变量可以在运行时多次变化,但只能初始赋值一次。其初始化的格式为:
const 类名 不变量名 =变量名;
const type constv =运行时确定的表达式 ;
即可以用一个运行时确定的表达式初始化不变量,活动的不变量仅只初始化一次。活动的不变量在其有效的范围内不能再赋值。而变量可以多次赋值。
不变量在定义的时候一定要赋初值。除非不变量在另外的文件里已经声明或者活动的不变量作为函数的形参:
extern const int arraysize;
void f (const double eps);
6
静态常量在编译时系统一般进行类似于符号常数的数值替换,静态常量一般不具备地址属性,但保留变量的其它属性如作用域、可见性等。
而活动的不变量的计算涉及到地址表达式因而一般拥有地址属性。
静态数组的维数是编译阶段静态确定的,可以用静态的整型常量来指定,而只读变量不用于界定静态数组的维数。
只读变量是一种清晰的编程风格,常出现在函数的形参列表中,表示 const形参或只读形参在函数体中不得改变,
但可以获得不同的初始值。
7
[例 ]静态的和活动的不变量
#include<stdio.h>
int f ( const int k)
{ const int j=k*k;
printf ("k=%d,j=%d\t",k,j);
return j;
}
void main (void)
{ const int n = 3;
int a [n];
const int m = f (n);
}
//运行输出结果为,k=3,j=9
8
十、变量的引用 (C++特有 )
引用是 C++的一个新的特征,引用是变量的别名,引用与相关变量是相通的。
变量定义语句为:
[ 类名 变量名 ; type v=常数 ; ],
声明变量引用的语句为:
类名 & 变量引用名 =变量名 ; type& rv = v;
//不写成 type & rv (v);
引用的声明与变量定义基本类似,但引用多了一个取地址运算符 &或也可称 &为引用声明符。
9
引用的类型与相关的变量类型通常必须一致。
引用是相关变量的替身,是不独立的变量。独立变量的生存期应长于或等于相关引用的生存期即变量的别名索引相关变量时该变量的生存期是有效的,该变量是存在的。
由声明语句引入的引用必须同时用变量或左值初始化。
外部说明如 {extern int & rv;}不必初始化,函数引用形参如 { void f (int & r ) ; }由虚实结合实现与变量或左值的关联。
对引用的操作就是对相关变量的操作,对变量的操作也是对相关引用的操作。
10
[例 ] 引用用变量名初始化,变量用常数初始化
#include <stdio.h>
void f ( int&r ) { r =3 ; } //引用形参 r直接设置实参变量 w的值
int y,z ;
void main ( void )
{ int x(1),&u= x;
//定义局部变量 x,初始化为 1。声明 u为 x的引用
int& v=y; v=2;
//声明局部引用 v为全局变量 y的别名,v赋值 2
int& w=z; f (w); //声明局部引用 w为全局变量 z的别名,w赋值 3
printf ("%d,%d,%d\n",u,y,z);
} //输出结果,1,2,3
11
十一,typedef类型声明语句
typedef 关键字为已经存在的数据类型指定一个别名,
其使用格式为:
typedef pre_ type type ;
typedef 预定已知类名 类的别名;
其中 pre_ type 是系统预定的类型如 int,float,long等也可是用户已经声明的类型,而引入的标识名 type是已知类名的别名和同义词。 例如 类型声明语句:
typedef int BOOL;
指定 BOOL为 int的别名,可以将 BOOL当作 int的同义词使用。
12
类型别名可以是另一个类型声明语句指定的别名 如:
typedef long LONG;
typedef LONG* pLONG;
//声明 pLONG为 long*的别名类型声明语句 [typedef pre_type type;]放在函数体中
type具有局部作用范围,放在函数定义之外 type具有全局作用范围,type一经声明就可以用于定义变量。 如:
type a,b,c,d;
由类的别名 type引入的定义语句规定 a,b,c,d都具有数据类型 type。
13
因此如下的变量定义语句便有了不同的解释,
long* pl,l,m,n; //只有 pl是 long*型的指针
pLONG x,y,z;
// x,y,z都是 pLONG型的数据即 long*型的指针其中 pl,x,y,z是 long*型的指针而 l,m,n是 long型的变量。
typedef引入的别名是既定类名的同义词但不是名称的宏替换。 如:
#define PLONG long*
PLONG pl,l,m,n;
等价于,long* pl,l,m,n;
14
在类型别名声明语句中去掉 typedef关键字得到变量定义语句,变量定义语句前冠上 typedef关键字得到类型别名声明语句。 例如:
typedef short s;
//声明名称 s是 short的别名
short s;
//定义名称 s是 short型变量注意,在同一个程序块中类型的别名不可以与变量名相同。
15