1.引用
概念:引用就是给已经创建好的变量取一个别名,并不是开辟出一块空间给我们新取的别名,而是和原来的变量使用同一个空间,只是换了一个名字。他有点像我们的外号。外号仍然表示的是我们。但是他和我们的名字不完全一致。
使用格式:(数据类型)& 引用名 = 引用对象

通过这里我们可以看到 ra 其实就是 a 本身,只是换了一个名字,它不仅数据一样,它存储的地址也是一样的。
注意:**创建引用变量的时候是必须要进行初始化的。**这个问题大家其实很容易可以想得明白,我既然是创建另外一个变量的别名,那我肯定要让编译器知道那个变量本身是谁。
此外还有一个特性是变量可以有多个引用,但是引用体本身一旦引用了一个变量,便无法再引用其他变量

最后一个特性,不知道大家猜到没有?引用体的值的改变是会影响变量本身的,有前面的地址一致的铺垫,这个特性其实不算难猜了。毕竟计算机对你创建的变量的所有了解,也仅储存在这个地址当中了。
cpp
int main()
{
int a = 3;
int& ra = a;
ra = 4;
cout << a << endl; //输出4
return 0;
}
1.1 引用调用
学了这个知识,大家可能会感到有些疑惑,我变量名称的使用又没有次数限制,为什么要弄出一个概念来给我的变量取一个外号呢?**这有什么好处?它发挥着怎么样的作用?**那我在这里就介绍其中的一种。
我们在写代码的时候可能会经常性的运用到一些。执行特定功能的封装函数,我们在调用这些封装函数的时候就需要传值。在传值的时候,我们既可以选择常规的在主函数内部传递时用实参。再用形参接收,也可以运用这里学到的引用调用。
cpp
add(int& x, int& y)
{
return x + y;
}
int main()
{
int a = 3;
int b = 4;
int s1 = add(a, b);
cout << s1 << endl;
return 0;
}
那这样做的好处有哪些?好处有两个点
第一点:我们通过引用调用的方式,**可以在封装函数内部去改变我们这个变量本身的值,**使得我们在写代码的时候更加的灵活。
另外一个好处就是它的运行效率会更高,这个也很容易理解,毕竟不用编译器单独开辟一块空间,创建一个变量。肯定是能够提高效率的。也许在调用次数不多的情况下,并不会表现出明显的差异。但在需要大量调用函数的情况,这个特点便显得尤为可贵这个特点就显的尤为可贵。
cpp
#include<iostream>
#include<string>
#include<ctime>
using namespace std;
int z = 2;
void consume_sc(int z) {} //实参传值
void consume_yy(int& rz) {} //引用调用
void test()
{
size_t begin1 = clock(); //记录开始时间 (实参)
for(int i = 0; i < 10000000; i++)
{
consume_sc(z);
}
size_t end1 = clock(); //结束时间
size_t begin2 = clock(); // (引用)
for(int i = 0; i < 10000000; i++)
{
consume_yy(z);
}
size_t end2 = clock();
cout << "实参传值花费的时间" << end1 - begin1 << endl;
cout << "引用调用花费的时间" << end2 - begin2 << endl;
}
int main()
{
test();
return 0;
}
这段代码是用来验证引用调用的,运行效率会高于去传实参。当然,如果你运行这段代码,你可能不会感受到很明显的区别,其实原因是在于我在这里没有让函数去执行任何的操作,仅仅是传递了一个整型参数。只要代码稍微复杂一点,哪怕你只是传了一个字符串,差距都会很明显
引用调用还能用来传字符串吗?是的,可以的。其实引用调用可以用来传各种各样的参数,包括string 定义的字符串。
2.函数重载
大家最想一个这样的场景,你进入一个公司去当程序员,这个公司原来的程序员写了各种各样的函数,我们可以在使用的时候直接通过名称去调用它们,以方便我们去写代码,像加法、减法、乘法、除法这些很简单的。然后因为这个公司存在了很长时间,所以这里的程序员就给各种各样,使用频率稍高一些的功能都封装成了一个函数,那你刚进入这个公司,难道你需要先去把你前辈们留下来的各种各样的函数全部去记下来吗?
你可能没有概念,我拿加法举例子,大家知道计算机在处理的时候,它要先知道你数据的类型,才能去执行特定操作,那加法就分为整数加法和浮点数加法,甚至还有字符的加法。如果你需要把它们全部记下来,是不是会太麻烦了些呢?
那 C++中有一个概念就很完美的解决了这个问题,那就是函数重载。
概念:函数重载是指在同一个作用域中可以有多个同名函数,它们的名称相同,但是参数列表不同。
作用域: 它其实可以被你理解为你的编译器中的一个项目,即使它不仅于此,初学者有这个理解便够用了
这里的不同包括:参数的数量,顺序,类型中至少有一个不同。返回类型不被计算在内,因为 C++不会根据返回类型来区分不同的函数。
cpp
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
int main()
{
int a = 3, b = 4;
double c = 1.3, d = 2.3;
int s1 = add(a, b);
double s2 = add(c, d);
cout << s1 << ' ' << s2 << endl;
}
如果你觉得没有理解上一段话,你可以看一这段代码。这就很好的展现了,编译器会根据你的函数名参数列表共同去区分不同的函数,去选择他应该执行哪个函数