目录
前言
auto和引用
提示:以下是本篇文章正文内容,下面案例可供参考
一、引用
1.1 引用的概念
从语法层面来说,引用相当于对一个变量取别名,例如 int a = 10 ; int& b = a;
b就是a的别名,b并没有被定义成一个新的变量,b和a指向同一片地址空间;
1.2 引用特性
引用的三个特性:1.引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
1.3 常引用
int main()
{
const int a = 10;
int& b = a;
int& b = 10;
//上两个引用语句在实现时会出现权限的放大(a本身是常量,无法改值,
//但是被引用后,a的别名b变成了int型,b的改变会同时改变a的值),会在编译阶段报错
const int& b = a;
//这样写就不会出现权限冲突
double d = 12.34;
int& rd = d;
//因为在发生隐式类型转换时会产生临时变量,而临时变量是const变量,所以上式也会报错,
const int& rd = d;
return 0;
}
1.4 引用传参和引用作返回值
1.作参数void Swap ( int & left , int & right ){int temp = left ;left = right ;right = temp ;}2.作函数返回值int & Add ( int a , int b ){int c = a + b ;static int c = a+b;return c ;//因为add函数栈帧在函数运行结束后会被系统收回(大部分编译器都会直接释放)//所以直接返回c的引用,可能只是返回了一个随机值,也有可能返回正确值;//所以在使用引用做返回值时,返回值一般不能是栈上的变量,可以用malloc或者static}int main (){int & ret = Add ( 1 , 2 );Add ( 3 , 4 );cout << "Add(1, 2) is :" << ret << endl ;return 0 ;}
1.5 传值、传引用效率比较
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直
接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效
率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
1.6 引用和指针的区别
在
语法概念上
引用就是一个别名,没有独立空间,和其引用实体共用同一块空间.
但是如果我们去看引用和指针的汇编代码对比,我们会发现在汇编层面实现它们的代码一摸一样
int main (){int a = 10 ;int & ra = a ;ra = 20 ;int* pa = & a ;* pa = 20 ;return 0 ;}
也就是说,指针和引用在底层的实现方式是一样的,但是在语法层的差异巨大。
1.7引用和指针的不同点:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2.
引用
在定义时
必须初始化
,指针没有要求
3.
引用
在初始化时引用一个实体后,就
不能再引用其他实体
,而指针可以在任何时候指向任何
一个同类型实体
4.
没有
NULL
引用
,但有
NULL
指针
5.
在
sizeof
中含义不同
:
引用
结果为
引用类型的大小
,但
指针
始终是
地址空间所占字节个数
(32
位平台下占
4
个字节
)
6.
引用自加即引用的实体增加
1,指针自加即指针向后偏移一个类型的大小
7.
有多级指针,但是没有多级引用
8.
访问实体方式不同,
指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全
二、auto
2.1 auto简介
与早期c中的auto类型符不同,c++中的auto不再是一个存储类型指示符,而是作为一
个新的类型指示符来指示编译器,
auto
声明的变量必须由编译器在编译时期推导而得
。
2.2 auto使用
1.auto与指针和引用结合起来使用
用
auto
声明指针类型时,用
auto
和
auto*
没有任何区别,但用
auto
声明引用类型时则必须
加
&
int main (){int x = 10 ;auto a = & x ;auto * b = & x ;auto & c = x ;cout << typeid ( a ). name () << endl ;cout << typeid ( b ). name () << endl ;cout << typeid ( c ). name () << endl ;* a = 20 ;* b = 30 ;c = 40 ;return 0 ;}
2. 在同一行定义多个变量
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译
器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
。
void TestAuto (){auto a = 1 , b = 2 ;auto c = 3 , d = 4.0 ; // 该行代码会编译失败,因为 c 和 d 的初始化表达式类型不同}// 此处代码编译失败, auto 不能作为形参类型,因为编译器无法对 a 的实际类型进行推导void TestAuto ( auto a ){}void TestAuto (){int a [] = { 1 , 2 , 3 };auto b [] = { 4 , 5 , 6 };}
2.3 不能使用auto的场景
1.
auto
不能作为函数的参数
2.
auto
不能直接用来声明数组
总结
本文简述了c++中&和auto两个关键字的使用方法和一些特殊情况。