# 一、Reference(引用)
## 1、引用的定义
A reference is an alias for another variable.
## 2、声明引用变量的方法
int x; int& rx = x;
or
int x, & rx = x;
## 3、引用的性质
(1)、通过引用所做的读写操作实际上是作用于原变量上的。
(2)、引用必须在声明的时候初始化。
(3)、引用一旦初始化,引用名字就不能再指定给其他变量。
## 4、引用类型做函数的参数:引用传递
(1)、引用可做函数参数,但调用时只需传普通变量即可;
(2)、在被调函数中改变引用变量的值,则改变的是实参的值。
# 二、空指针
## 1、空指针
### 1.1、0带来的二义性问题
(1)、c++03中,空指针使用0来表示。0既是一个常量整数,也是一个常量空指针;
(2)、c语言中,空指针使用(void *)0来表示;
(3)、也用NULL 来表示空指针。
### 1.2、c++11中引入保留字nullptr作为空指针。
## 2、Dynamic memory management:Allocate/Release
### 2.1、c++中通过运算符new申请动态内存
语法格式为:new <类型名> (初值);//申请一个变量的空间
new <类型名> [常量表达式];//申请数组;
如果申请成功,返回指定类型内存的地址;
如果申请失败,抛出异常,或者返回空指针(nullptr)。
### 2.2、动态内存使用完毕后,使用delete云算法释放。
语法格式:delete <指针名> ;//删除一个变量;
delete [] <指针名>;//删除数组空间。
# 三、列表初始化(List Initialization)
## 1、列表初始化的方法
列表初始化是c++11的一个新特性,列表初始化使用花括号括起来的一些值,共有两个分类:直接列表初始化(Direct list initialization)和拷贝列表初始化(Copy list initialization)。如下所示,左侧为c++11标准之前的初始化方法,中间为c++11支持的直接列表初始化,左侧为拷贝列表初始化:
int x = 0; int x{0}; int x = {0};
int y(2); int y{2}; int y = {2};
char c('a'); char c{'a'}; char c = {'a'};
int arr[] = {1,2,3}; int arr[]{1,2,3}; int arr[] = {1,2,3};
char s[] = "Hello"; char s[]{"Hello"}; char s[] = {"Hello"};
提倡使用列表初始化,因为列表初始化可以避免变量被窄化,如
int x = 1.1;//编译器一般不会报错,x的值直接被赋值为1;
int x{1.1};//vs2015下编译器报错,提示从"double"到"int"需要收缩转换;
# 四、类型转换(Type conversion)
## 1、类型转换有两种
隐式类型转换和显式类型转换(强制类型转换)
隐式类型转换由编译器按照数据类型的转换规则自动转换,无需程序员干预,但可能导致数据精度损失或者转换失败,所有应尽量避免使用隐式类型转换。
强制类型转换,语法如下:
static_cast <type> value;
static_cast<double>1/2;//强制将整型1转换为double类型;
# 五、自动类型推导-auto关键字
## 1、关键字auto
c++03及之前的标准中,auto放在变量声明之前,声明变量的存储策略,但是这个关键字常省略不写。
c++11中,auto关键字放在变量之前,作用是在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。
如:
int a = 10;
auto au = a;//自动类型推断,au为int类型;
std::cout << typeid(au).name() << std::endl;
## 2、auto的使用限制
(1)、auto变量必须在定义时初始化,类似于const关键字;
auto a = 10;//正确;
auto b;//错误,必须初始化;
(2)、定义在一个auto序列的变量必须始终推导成同一类型;
auto a4 = 10, a5{20};//正确;
auto b1{10}, b2 = 20.0//错误,没有推导为同一类型;
(3)、如果初始化表达式是引用或const,则去除引用或const语义;
int a{10};
int& b = a;
auto c = b;//c的类型为int,非int&;
auto &c = b;//c的类型为int&;
const int d = 10;
auto b1 = d;//b1为int类型,非const int;
auto& b2 = d;//b2为const int;
(4)、如果auto关键字带&符号,则不去除引用或const语义;
(5)、初始化表达式为数组时,auto关键字推导类型为指针;
(6)、若表达式为数组且auto带上&符号,则推导类型为数组类型;
int a3[3]{1,2,3};
auto b3 = a3;
std::cout << typeid(b3).name() << std::endl;//输出为int* 类型;
auto& b4 = a3;
std::cout << typeid(b4).name() << std::endl;//输出为int[3]类型;
(7)、c++14中,auto可作为函数的返回值和参数类型。