C++ Primer 从入门到放弃  第二章变量和基本类型 [复合类型&const限定符]

C++ Primer 从入门到放弃 第二章变量和基本类型 [复合类型&const限定符]

第二章变量和基本类型 [复合类型&const限定符]


引用:
引用(reference)为对象起了另外一个名字,通常使用"&d"的形式来定义。

int ival = 1024;
int &refVal = ival;
int &refVal2; // 错误,引用必须被初始化
int &refVal3 = 44; //错误,引用的初始值必须是一个对象

引用即别名,引用定义时,将与他的初始对象绑定在一起,当对一个引用进行操作时,都是在与之绑定的对象身上进行的。因为引用不是对象,所以不能定义引用的引用。


指针:
指针(Pointer)是指向另一钟类型的复合类型。指针本身就是一个对象,允许对指针进行赋值和拷贝。指针无需在定义时赋值。
指针存放的是某一种类型变量的地址,如果想要获取地址,使用"&"取地址符。
利用指针访问对象使用""解引用操作符。
空指针不指向任何对象。
void指针可以指向任何指针对象,但是无法访问该地址下指向内存空间的对象。

int *ip, *ip2;     //ip与ip2都是指向int型对象的指针
double dp, *dp2;   //dp2是指向double型对象的指针, dp 为double对象
int val = 42;
int *p = &val;     //对指针进行赋值
cout<< *p;         //输出42
int *s = 0;        //空指针
int *u = nullptr;  //空指针
void *t = &val;
cout<< *t;         //错误,无法访问void*指针下的对象

建议: 初始化所有指针,如果访问了一个尚未被初始化的指针它可能被指向任何地址,如果地址上恰好有值,且指向不明,将会导致崩溃。


指向指针的指针与指向指针的引用:

int val = 1024;
int *pi = &val;
int **ppi = &pi;
cout<< **ppi;  //输出1024

int i = 1;
int *p;
int *&s = *p;
s=&i;
cout<< *s;  //输出1


const限定符:
const定义一种变量,它的值不可以改变。默认情况下const变量的定义只在单一文件内有效,如果想让编译器在用到该变量的所有地方替换该变量的值,那么需要搭配
"extern"关键字使用。

// main 文件
#include<iostream>
extern const int ss =222;
int fun();
int main()
{
    std::cout<<fun();
}


//t1文件
extern const int ss;
int fun()
{
    return ss;
}

编译执行后输出222;


顶层const与底层const:

// 指向常量的指针
const int i = 2;
int *p =&i;         //错误,p为普通指针
const int *pi = &i; //正确,pi为指向常量的指针
*pi = 4;            //错误,不能给常量赋值

//常量指针
const double i = 3.1415926;
const double  *const pi = &i; //指向常量对象的常量指针

我们用顶层const(top-level const)表示指针本身就是一个常量。用底层const(low-level const)表示指针指向的对象是一个常量。
所有的用于声明引用的const都是底层const。


常量表达式:
常量表达式是指不会改变且在编译期间计算出结果的表达式。字面值属于常量表达式。

const int max = 20;         //常量表达式
int a = 27;                 //非常量表达式
const int gz = get_size();  // 运行时得到,非常量表达式

C++ 11新标准允许使用"constexpr"定义一个常量表达式。

这一部分结合2.4.2--2.4.4习题理解为佳。

禽兽一只:《C++ Primer》从入门到放弃zhuanlan.zhihu.com图标

编辑于 2018-05-22