【c++】引用、auto、和范围for循环、内联函数

一、引用

1.1、引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引

用的变量共用同一块内存空间。

类型& 引用变量名(对象名) = 引用实体;

 

1.2、举例说明

1.2.1、引用变量

int ming = 10;
	int &xiaoming = ming;
	cout << xiaoming << endl;
const int a = 10;
	//int& ra = a;   // 该语句编译时会出错,a为常量
	const int& ra = a;
	// int& b = 10; // 该语句编译时会出错,b为常量
	
	
	//const int& b = 10;
	double d = 12.34;
	//int& rd = d; // 该语句编译时会出错,类型不同
	const int& rd = d;//和版本有关

对xiaoming的操作完全等同于对变量ming的操作

1.2.2、作为函数参数

void func(int &a)
{
	/* 用引用的方式封装了指针,只能引用变量*/
	cout << a << endl;
}

最为函数参数,只能引用变量,因为引用的底层是用指针实现的

1.2.3、作为函数的返回值

int& test(int &a )
{
	return a;/*引用的根本是指针,要想返回值牢固一般参数作为返回值*/
}

引用其实是指针,所以返回指针更加安全。

如果函数返回时,离开函数作用域后,其栈上空间已经还给系统,因此不能用栈上的空间作为引用类型

返回。如果以引用类型返回,返回值的生命周期必须不受函数的限制(即比函数生命周期长)

 

1.3、引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

底层实现上实际是有空间的,因为引用是按照指针方式来实现的

1.4、特点:
1、引用在定义时必须初始化
2、一个变量可以有多个引用
3、一个引用一旦引用了一个变量,就不能再引用其他变量了

二、内联函数

2.1、概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,

内联函数提升程序运行的效率。

2.2、例子

inline int test1(int &a)
{
	return a;
}

2.3、特点

1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使

用作为内联函数。

2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等

等,编译器优化时会忽略掉内联。

3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找

不到。

2.3.1缺点

  1.  会使代码膨胀,增加的可执行文件的体积;
  2. inline函数改变后会让所有使用该函数的代码需要重新编译;
  3. 可能使头文件更加臃肿(inline函数经常实现在头文件里);
  4. 可能导致潜在更多的分页错误;
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
 cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
 f(10);
 return 0;
}

// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl f(int)" (? f@@YAXH@Z),该符号在函数 _main 中被引用

三、auto

3.1、概念

在早期C/C++auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它 

C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指 示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

3.2、举例

int TestAuto()
{
return 10;
}
int main()
{
int a = 10;
auto b = a;
auto c = 'a';
auto d = TestAuto();
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endlcout << typeid(d).name() << endl;
}

使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类

。因此auto并非是一种类型的声明,而是一个类型声明时的占位符,编译器在编译期会将auto替换为变

量实际的类型

3.3、特点

3.3.1、

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

auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必须加&

int main()
{
    int x = 10;
    auto a = &x;
    auto* b = &x;
    auto& c = x;
}

3.3.2、

不能做函数的参数和返回值

3.3.3、

在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个

类型进行推导,然后用推导出来的类型定义其他变量

四、基于范围的for循环(c++11)

4.1、

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引

入了基于范围的for循环。for循环后的括号由冒号分为两部分:第一部分是范围内用于迭代的变量,第二

部分则表示被迭代的范围

int arr[10] = { 5,6,8,1,0,1,6,56,92,84 };
for (auto i : arr)
		cout << i << " ";

注意此处 的“:”容易打成中文的:很难查出来

范围for很鸡肋,没太大意义

EOF

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值