C++入门 (2) >>引用>>内联函数>>auto关键字

1 引用

定义:给变量起别名。

方法:在类型后面加上&符号。

主要作用:代替函数传指针。

例:

复制代码
void test(int& a)  //参数为int&类型
{
	a = 10;
}

int main()
{
	int m = 3;
	int& z = m;    //给m起别名叫z,类型为int&
	test(z);
	cout << m << endl;   //m的值输出为10
	return 0;
}

注意事项:

1.在引用中,看起来是不开空间的,实际上底层要开空间,强制类型转换和隐式类型转换赋值的过程会产生中间变量,中间变量具有常属性,把常量转换成变量会放大权限,(权限只能平移或者缩小)。所以必须在引用前加const。

例:

复制代码
int main()
{
	double a = 3.14159;
	//int& b = a;		//报错:无法用double初始化int&类型(非常量限定)
	const int& c = a;
	return 0;
}


汇编代码:

//	//int& b = a;		//报错:无法用double初始化int&类型(非常量限定)
//	const int& c = a;
//00007FF7B38C1EFA  cvttsd2si   eax,mmword ptr [a]  
//00007FF7B38C1EFF  mov         dword ptr [rbp+44h],eax  
//00007FF7B38C1F02  lea         rax,[rbp+44h]  
//00007FF7B38C1F06  mov         qword ptr [c],rax  
//	return 0;

2 内联函数

关键字:inline

作用:展开较简单的函数,不用建立函数栈帧。节省栈空间。

项目属性修改:(如果在汇编中没有展开inline函数需要进行以下操作)

项目 ---> xxxx属性 ---> c/c++ ---> 常规 ---> 调试信息格式 ---> 程序数据库

优化 ---> 内联函数扩展 ---> 只适用于inline

例:

复制代码
inline int abc(int& a, int& b)   //加了inline的内联函数
{
	return a + b;
}

int main()
{
	int m = 3, n = 5;
	int& aa = m;
	int& bb = n;
	int c=abc(aa, bb);    //在汇编代码中会展开而不是调用函数
	cout << c << endl;
	return 0;
}

非内联汇编代码:

复制代码
	int c=abc(aa, bb);
00007FF74C2F19AB  mov         rdx,qword ptr [bb]  
00007FF74C2F19AF  mov         rcx,qword ptr [aa]  
00007FF74C2F19B3  call        abc (07FF74C2F1334h)   //这里call了abc的地址,调用了call
00007FF74C2F19B8  mov         dword ptr [c],eax  

内联汇编代码:

复制代码
	int c=abc(aa, bb);
00007FF6CF771549  mov         rax,qword ptr [aa]    //aa移动到rax
00007FF6CF77154E  mov         eax,dword ptr [rax]   //rax移动到eax
00007FF6CF771550  mov         rcx,qword ptr [bb]    //bb移动到rcx
00007FF6CF771555  add         eax,dword ptr [rcx]   //rcx加到eax中
00007FF6CF771557  mov         dword ptr [c],eax     //eax移动到c中

//把函数的内容展开,没有call函数地址,没有对函数进行调用

3 auto关键字与typeid

定义:auto--->自动变量 // typeid--->类型

复制代码
int main()
{
	auto a = 10;       //自动变量a=10
	cout << typeid(a).name() << endl;    //输出a的类型为int
	return 0;
}

4 扩展 ------> 范围for ---> 遍历数组

范围for会自动识别数组的长度和类型

复制代码
int main()
{
	int a[5] = { 0 };
	int k = 0;
	for (auto& m : a)     
	{
		m = k += 2;
	}
	for (auto m : a)
	{
		cout << m << " -> ";
	}
	return 0;
}

完

相关推荐
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h5 小时前
c++ string
开发语言·c++
raindayinrain5 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的5 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao6 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
小徐不徐说7 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的7 小时前
C++第一节课
开发语言·c++
UIU1147 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统