C++基础【2】

本文详细介绍了C++中的引用和auto关键字。引用作为变量的别名,不占用额外空间,定义时必须初始化且不可改变引用目标。auto用于类型推导,简化代码,但不能用于函数参数和数组声明。引用与指针在底层实现类似,但在语法上有显著差异。
摘要由CSDN通过智能技术生成

目录

前言

一、引用

1.1 引用的概念

 1.2 引用特性

 1.3 常引用

1.4 引用传参和引用作返回值

1.5 传值、传引用效率比较

1.6 引用和指针的区别

1.7引用和指针的不同点:

二、auto

2.1 auto简介

2.2 auto使用

1.auto与指针和引用结合起来使用

2. 在同一行定义多个变量

2.3 不能使用auto的场景

总结


前言

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两个关键字的使用方法和一些特殊情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值