【C++ Primer Chapter 2 总结】引用 & 指针 & const & constexpr

1.引用变量需要初始化,绑定(bind)到某个对象,并且一旦初始化之后无法再重新绑定到其他变量。引用变量只是已经存在的对象的一个别名,不是对象。
2.指针变量用于其他对象的间接访问(保存的是其他对象的地址)。指针对象本身是一个对象,可以被赋值/复制,可以指向不同的对象,不一定需要初始化。
3.空指针不指向任何对象。三种方法初始化。nullptr是一种特殊的类型可以转换为其他指针类型。NULL是cstdlib头文件中的变量,值为零。在编译代码前,预处理器变量会被预处理器替换为其特定的值。
int *p = nullptr;       //一般用这种方式初始化空指针
int *p = 0;
int *p = NULL;        //NULL会在编译前被替换为值0
 
4.每个变量定义是由基础类型(base type)+一组声明符(类型修饰符 type modifier)组成的。当有多个类型修饰符时 ,以逻辑的形式组合。理解复杂指针/引用变量声明的方法:从右向左读定义.
int a, *p = &a, &r = a;       //a是int, p是指向int的指针, r是int的引用. 这里int是基础类型, p前面的*和r前面的&都是类型修饰符   
int* p;
int *p;                 //和上面一样,两种写法
int* p1, p2;             //p1是指向int的指针, p2是int. *是p1的类型修饰符,与其他变量无关
int *p1, *p2;            //p1, p2都是指向int的指针
 
int val = 42;             //val是int
int *pi = &val;            //pi是指向int的指针
int **ppi = π              //ppi是指向指向int的指针的指针
 
int i = 42;
int *p;
int *&r = p;              //r是指针p的引用. 引用不是一个对象, 因此没有指向引用的指针. 指针是一个对象, 因此有指针的引用.  这里理解r的类型的方法:从右向左读定义. r最左边是&, 因此r是i一个引用, 剩下部分表示r引用的类型是指向int的指针.
r = &i;
*r = 0;
cout << i;               //i的值被改为0
 
5.要在多个文件中共享const对象,必须声明为extern。
6.引用和const。
“const reference” as the abbr. of“reference to const” 
没有常量引用(const reference)的说法,因为引用变量一旦初始化之后,bind to an object,就不可改变,bind to another object。
引用“引用”(refer to)的是const类型还是非const类型影响的是/是否可以通过引用名对原对象进行操作,而不会影响是否可以更改引用本身的绑定(不可更改)。
可以将“引用”常量的引用绑定到任何非const的对象,字面值,或一般的表达式,只要该表达式可以转换到引用的类型。
dobule dval = 3.14;
const int &ri = dval;
 
7.指针和const。
指向常量的指针(pointer to const)并不表明指针指向的对象是否是常量,只是说明是否可以通过该指针改变指向的对象。
常量指针(const pointer)必须初始化,并且初始化后值不可更改。指针本身是常量并不说明是否能通过指针改变指针指向的对象,只是说明该指针的值(指针存的地址)不可以改变。
 
top-level const:指针本身是常量。应用于对象本身。
low-level const:指针指向常量对象。(该对象可以不是常量,指向常量对象只是不能通过指针改变该对象)
上面两个的区别主要在于拷贝对象的时候:top-level const可以忽视,low-level const不可以忽视,必须有相同的low-level const或者non-const可以拷贝给const对象。
 
int i = 0;
int *const p1 = &i;
const int ci = 42;
const int *p2 = &ci;
const int * const p3 = p2;
const int &r = ci;
 
i = ci;                  //ok
p2 = p3;               //ok
int *p = p3;           // error: p3有low-level const, p没有
int &r = ci;           // error: 不能将一般的int&引用绑到常量对象上 
 
8.constexpr 变量。
通过声明对象为constexpr,可以让编译器来确认变量是否是常量表达式。
constexpr修饰指针变量时,施加的是top-level const的影响。
const int *p = nullptr;     //  p是一个指向const int的指针
constexpr int *q = nullptr;  // q是一个指向int的常量指针
 
9.类型别名(Type Aliases)。
typedef type new_type_name;
using new_type_name = type;

  

10.typedef 和 const。
出现在base类型中的const修饰的是给定类型。
typedef char *pstring;
const pstring cstr = 0;      // base type: pstring(pointer to char). cstr is a constant pointer to char. 这里把pstring看做和int一样的基础类型. 这里的const是top-level.
const pstring *ps;          // ps is a pointer to constant pointer to char. 这里的const是low-level.

  

 
 
posted @ 2021-05-29 17:33  萌新的学习之路  阅读(81)  评论(0编辑  收藏  举报