引用、内联函数、auto关键字详解!
1.引用
1.1 什么是引用?
引用就是给一个已经存在的变量取了别名,不会定义新变量,也不会开辟新的空间,它和它引用的变量共用同一块内存空间。
例如:诸葛亮就有“卧龙”的外号,这两个名字指的都是同一个人。
1.2 引用如何使用?
引用定义的方法:类型& 引用变量名 = 引用实体;
有几个需要注意的点:
1. 这里的类型必须与引用实体类型相同;
2. & 不是取地址符号;
3. 引用变量必须在定义时初始化;
4. 一个变量可以有多个引用;
5. 一个引用只能引用一个实体;
下面的实例中,引用变量b就是变量a的引用(别名)
int main()
{
int a = 10;
int& b = a;
//int& c; 没有初始化,编译时会出错
return 0;
}
1.3 常引用
概念:引用变量作为一个常量的引用
int main()
{
const int a = 10;
//int& b = a; 变量a被const修饰,成为常量,因此int型的引用变量不能作为a的引用
const int& b = a; //
//int& c = 10; int型的引用变量不能作为常量的引用
const int& c = 10;
return 0;
}
一种特别的常引用:
int main()
{
double a = 2.22;
int b = a;
//int& c = a;
const int& c = a;
return 0;
}
1.4 引用有什么作用?
- 做参数:
a.输出型参数
void Swap(int& c, int& d)
{
int temp = c;
c = d;
d = temp;
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
return 0;
}
Swap函数中形参为实参的引用,交换形参相当于直接交换实参,其所代表的内容是相同的。
b. 大对象引用传参,可以节省资源,提高效率。
- 做返回值
引用做返回值与普通返回值有什么区别?
1.5 引用与指针的区别
引用 | 指针 | |
---|---|---|
概念 | 一个变量的别名 | 一个变量的地址 |
定义时 | 需要初始化 | 不用初始化 |
sizeof的含义 | 引用类型的大小 | 地址空间所占的字节数(32位占4字节) |
访问实体方式 | 编译器处理 | 需要解引用 |
++的含义 | 引用的实体内容+1 | 指针中存放的地址+1*(类型大小),即指针偏移到了相邻地址处 |
其他 | 没有空引用 | 有空指针 |
没有多级引用 | 有多级指针 | |
没有野引用,更加安全 | 有野指针,存在内存泄漏问题 | |
作为一个实体的引用后就不能作为另一个实体的引用 | 可以指向任意的同类型对象 |
2.内联函数
2.1 为什么要有内联函数?
一个频繁调用的函数,建立栈桢时会有空间和时间的浪费,C++用内联函数来解决这一问题。
2.2 什么是内联函数?
C语言解决一个函数频繁调用的方法是宏函数,但是宏函数不方便调试,复杂易出错。
C++解决方法:inline(内联)函数,不会有压栈开销,减少栈桢,适合于频繁调用的**小(小于10行)**函数。
内联函数会在调用的地方直接展开。
2.3 内联函数怎么用?
inline void Swap(int& c, int& d)
{
int temp = c;
c = d;
d = temp;
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b); //这里会直接展开上面的代码
}
3.auto关键字(自动推导类型)
使用方法:
int main()
{
int a = 10;
auto b = a;
auto c = "c";
auto d; //不能通过编译,auto定义变量时必须初始化
return 0;
}
auto结合指针、引用的使用:
- 声明指针类型时,auto 和 auto*都可以使用
- 声明引用类型时,只能使用auto&
int a = 10;
auto* b = &a;
auto c = &a;
auto& d = a;
同一行定义多个变量:
- 该行各个变量的类型必须相同
auto a = 10,b = 3;
auto c = 10,d = 3.0; //会编译失败,因为c和d的初始化表达式类型不同
注意:
- auto定义变量时必须进行初始化
- auto不能作为函数的形参类型
- auto不能作为数组的类型