C++语法难点(声明和定义,指针的引用,对常量的引用,指向常量的指针,常量指针)持续更新中
变量声明和定义的关系
声明的存在允许把程序拆分成多个逻辑部分来编写,支持分离式编译。声明使得名字为程序所知,一个文件如果想使用别处定义的名字就必须包含对那个名字的声明,而定义负责创建与名字关联的实体。
声明一个变量,就在变量名前添加关键字extern
,而且不要显式地初始化变量。
extern int i; // 声明 i 而非定义 i
int j; // 定义 j
任何包含了显式初始化的声明即成为定义,这么做会抵消 extern
的作用。
extern double pi = 3.14; // 定义
变量能且只能被定义一次,但是可以被多次声明。
指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针。但是指针是对象,所以存在对指针的引用。
int i = 42;
int *p; // p是一个int型的指针
int *&r = p; // r是一个对指针p的引用
r = &i; // r引用了一个指针,因此给r赋值就是令p指向i
*r = 0; // 解引用r得到i,也就是p指向的对象,将i赋值为0
对常量的引用
与普通引用不同的是,对常量的引用不能用作修改它所绑定的对象。
const int ci = 1024;
const int &r1 = ci; // 正确:引用及其对应的对象都是常量
r1 = 42; // 错误:r1是对常量的引用
int &r2 = ci; // 错误:试图让一个非常量引用指向一个常量对象
因为不允许直接对ci赋值,当然也就不能通过引用去改变ci。因此对r2的初始化是错误的。假设该初始化合法,则可以通过r2来改变他引用对象的值,这显然是不正确的。
指向常量的指针
指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址只能使用指向常量的指针。
const double pi = 3.14; // pi是个常量,它的值不能改变
double *ptr = π // 错误:ptr是一个普通指针
const double *cptr = π // 正确:cptr可以指向一个双精度常量
*cptr = 42; // 错误:不能给*cptr赋值
允许一个指向常量的指针指向一个非常量对象,但是不能通过指向常量的指针修改常量对象的值。
double dval = 3.14;
cptr = &dval;
常量指针
常量指针,把指针本身定义为常量。常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。
int errNumb = 0;
int *const curErr = &errNumb; // curErr将一直指向errNumb
const double pi = 3.14;
const double *const pip = π // pip是一个指向常量对象的常量指针
常量指针的作用类似于数组名,都是存放一个地址,但是本身的值不可改变。
持续更新中。。。