1.引用:
int ival=1024;
int &refval=ival;//正确,refval时ival的别名
int &re;//错误,引用必须被初始化
int &ii=42;//错误:不能为非常量引用绑定字面值
const int &ii=42;//正确:可以为常量引用绑定字面值
2.初始化空指针
int* p=0;
int* p=NULL;
int* p=nullptr;//最好用这个
任何非零指针的条件值都是true.
void* 能存放任何类型对象的地址,但不能直接操作对象的值。
3.符合类型的声明
int* p1,p2;
p1是int类型的指针,p2是int型的值,int是基本数据类型而非int;
4.const 限定符
(1)基础定义
const int bufsize =520;//不可被改变
const类型不可被改变,因此必须初始化。
(2).变量声明和定义的关系
extern int i;//声明而非定义i
int j;//声明并定义j
extern double pi=3.1415926;//定义
//在函数体中,如果试图初始化一个由extern 关键字标记的变量,将引发错误
变量只能被定义一次但可以多次声明。
可以在头文件中定义,在函数中调用头文件,并声明,即可使用头文件中所定义的值。
(3).初始化和对const的引用
int i=42;
const int &r1=i;//正确,允许将const int&绑定到一个普通int对象上
const int &r2=42;//正确
const int &r3=r1*2;//正确
int &r4=r1*2;//错误,r4是一个普通的非常量引用
const int可以引用int,但是int却不可以引用const int;
不可以通过常量引用赋值,例:
int i=42;
int &r1=i;
const int &r2=i;
r1=0;
r2=0;//错误,r2是一个常量引用
(4).指针和const
const在double*之前:
const double pi=3.14;
double *pr=π//错误,pr是一个普通指针
const double *cpr=π//正确
*cpr=42;//错误,不能给*cpr赋值
double dval=3.14;
cpr=&dval;//正确,所指向的对象可以变,但是不可以操作对象的值
const在double*之后:
int err=0;
int* const cur=&err;//cur将一直指向err
*cur=0;//正确,重置了所指对象的值
const double pi=3.1415926;
const double* const pip=π//pip是一个指向常量对象的常量指针
(5).顶层const
顶层const:指针本身是一个常量;
底层const:指针所指的对象是一个常量;
int i=0;
int *const p1=&i;//不能改变p1的值,为顶层const
const int ci=42;//不能改变ci的值,为顶层const
const int *p2=&ci;//允许改变p2的值,为底层const
4.类型别名
typedef dounle wages;//wages是double的同义词
typedef wages base,*p;//base是double的同义词,p是double*的同义词
using dd=double;//dd是double的同义词
5.auto类型说明符
int i=1;
double s=0.01;
auto ss=s+i;//auto会自动用s和i相加的结果来判断ss的类型
auto i=0,*p=&i;//正确:i是整数、p是整型指针
auto sz=0,pi=3.14;//错误:sz和pi的类型不一致
6.decltype类型指示符
从表达式的类型判断出要定义变量的类型
const int ci=0, &cj=ci, *p=&ci;
decltype(ci) x=0;//x的类型是const int
decltype(cj) y=x;//y的类型是const int&
decltype(cj) z;//错误,引用要初始化
decltype(*p) c;//错误,任何解引用操作decltype将得到引用类型
decltype((ci)) d;//错误,decltype(())表示引用