初探C++(2)
6.引用
1.引用的概念
通俗来讲,引用就是取别名的意思,它的符号表示是&,要与C语言中的取地址符号(&)区分开来。
int a=10;
int& b=a;//b就是对a的引用
int& c=a;
int& d=c;
以上便是引用的例子,一个变量可以有多个引用,也就是可以取多个名称,但是对他们取地址,会得到同一个地址。
类型& 引用变量名(引用的对象)=引用实体
2.引用的特性
1.引用在定义时必须初始化。
int a=10;
int& pa;//error 该语句会编译出错
2.一个变量可以有多个引用。
3.引用引用一个实体,便不能再引用其他实体。
3.常引用
不能对变量的权限进行放大,如不能把const给非const
//权限放大
const int a=10;
//int& b=a; error
const int& b=a;
即const不能给非const。
//权限缩小
int c=20;
const int& d=c;
int& e=c;
即非const既可以给非const,也可以给const。
注意:可读可写可以变成只读。
权限的放大缩小适用于指针和引用,赋值不受影响。
4.使用场景
1.做参数
void Swap_cpp(int& a,int& b)
{
int tmp=a;
int a=b;
int b=tmp;
}
2.做返回值
int& Add(int a,int b)
{
static int c=a+b;
return c;
}
注意:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。这也就是在变量c前边加了static的原因。
5.传值、传引用的效率比较
1.传值不管是传参还是返回值,都会产生一个拷贝,而传引用则不会,临时变量具有常性。
2.引用:输出型参数,同时可以提高效率。
3.关于引用返回:一个函数想要引用返回,返回变量出了这个函数的作用域如果还存在,就可以使用引用返回,否则就不建议使用。(联想static)
7.内联函数
1.概念
以inline修饰的函数称为内联函数,在编译时,编译器会在调用内联函数的地方对函数进行展开。
inline void Swap(int& x1,int& x2)
{
int tmp=x1;
x1=x2;
x2=tmp;
}
在频繁调用Swap函数时,便会展开。
2.特性
1.inline是一种以空间换时间的做法,在代码很长或者有循环递归时不建议使用。
2.inline对于编译器来说只是一个建议,会自动进行优化,并决定是否展开。
8.auto关键字
1.概念
简单来说,auto可以理解为“自动”,使用auto声明的变量编译器会自动的推导出类型。
int a = 10;
auto b = a; //b为int类型
auto c = 'a';//c为char类型
注意使用auto定义变量时,必须进行初始化。
2.使用场景
1.auto和指针与引用结合起来使用。
用auto声明指针类型时auto和auto*没有区别,但是声明引用必须加&。
int x=10;
auto a=&x;
auto* b=&x;
auto& c=x;
2.在同一行定义多个变量。
当一行中定义多个变量时,变量类型要相同,因为编译器实际只对第一个类型进行推导。
3.auto不能作为函数的参数。
4.auto不能直接用来声明数组。
9.基于范围的for循环
1.语法
int a[]={1,2,3,4,5};
for(auto& e:a)
e*=2;
for(auto e:a)
cout<<e<<" ";
范围for循环后的括号由冒号分成两个部分:
1.范围内用于迭代的变量 如e。
2.被迭代的范围 a数组内。
2.使用条件
1.迭代的范围必须是确定的。
10.指针空值nullptr
在指针中NULL表示空指针,实际上NULL会被定义为一个字面常量0。
在C++中可以使用nullptr关键字来定义空指针。