c++11分章1
主要内容: 引用,指针,数组,动态内存分配
引用
<类型>&<变量> = <对象或变量>
定义
引用就是变量的另一个别名,对应的变量/对象必须存在
1
2
3int x;
int& rx = x;
// int x,&rx = x;性质
1.通过引用所做的读写操作实际上是作用于原变量上的
2.引用必须在声明时,开始初始化
3.引用一旦初始化,引用的名字不能再指定给其他变量
1
2
3
4
5
6
7
8
9
10int a { 0 }, b { 1 };
int& r { a }; // 引用变量 r 在声明的同时就要初始化,r是a的别名
r = 42; // 相当于 a = 42
r = b; // 相当于 a = b; 执行后 a 的值是1
// 此处不是让r变成b的引用
// 引用r声明并初始化后,r就不能再改为其它变量的引用
int& r2 = a; // 继续给a起别名
int& r3 = r; // 声明引用变量 r3,用r初始化
// 这个相当于 int& r3 = a; 因为 r 是 a 的别名指针和引用的差异
指针和引用的应用场景是函数参数传递
void f(int* pa ,int* pb); void f(int& pa,int& pb);
从软件设计角度来看,使用引用更好,因为调用方不需要额外传参数时进行取地址运算.
- 存取值的方式
- 对指针变量需要使用*来读取相应内存的内容
- 初始化
- 指针没有要求
- 对象或变量的存在性
- 引用有要求
- 存取值的方式
const和引用
**const <类型>&**常用于返回值以及参数传递(保证不能修改相应的变量)
1
2
3
4
5
6
7
8
9
10
11
12
13//变量的引用
int val =100;
int & myval1=var;
const int & myval2 = var;
myval1 = 300;//合法,可以通过myval2对var进行修改,此时myval2,myval3,var同时被修改
myval2 = 100;//非法
//常量的引用
int b=100;
const int& aa=b;//b的引用,可以选择用const的修饰
const int& bb=1;//这里必须用const修饰
aa = 10;//非法
bb = 20;//非法引用在参数传递中的使用
如果在函数中不修改变量,建议使用 const T&
1
2
3
4
5
6
7
8
9
10
11
12
13
14int var =100;
const int cvar =200;
/*形参:
void f(int a1,int &a2, const int& a3)
{ }*/
f(1,2,3);//2和a2 不合法
f(1,var,var);
f(1,cvar,cvar);//cvar与a2 不合法
f(1,var,cvar);
f(1,cvar,var);//cvar和a2 不合法
f(var,var,var);
f(cvar,var,cvar);
二维数组的初始化方式
空指针和动态内存分配
1.1 0带来的二义性问题
- C语言中,空指针使用(void *)0来表示, 有时候,用“NULL”来表示空指针(由编译器决定实现方式,一种可能的实现方式是#define NULL 0)
- C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。
- C++11中引入保留字“nullptr”作为空指针