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;
}
完