建设网站需求,如何查询网站快照,爬虫做视频网站,做网站的简称目录
#x1f495;1.函数的重载
#x1f495;2.引用的定义
#x1f495;3.引用的一些常见问题
#x1f495;4.引用——权限的放大/缩小/平移 #x1f495;5. 不存在的空引用
#x1f495;6.引用作为函数参数的速度之快#xff08;代码体现#xff09; #x1f4…目录
1.函数的重载
2.引用的定义
3.引用的一些常见问题
4.引用——权限的放大/缩小/平移 5. 不存在的空引用
6.引用作为函数参数的速度之快代码体现 7.引用的思考 最新更新时间——2025.1.9 一个人的坚持到底有多难 在座的各位都能回答这个问题 1.函数的重载
在C中是支持函数的名称重复的但并不是完全重复
要求这些同名函数作用在同一作用域
且函数的形参不同-:可以是 参数类型不同 或者 参数个数不同 或者 参数顺序不同这也叫做函数的重载
那么函数的重载具体是什么呢代码如下 第一种情况同名函数的形参类型不同——函数的重载 由代码可见同名函数的形参是不同的但是依旧可以运行没有报错我们也不必担心编译器会不知道运行哪个函数因为在我们使用函数传参时编译器会智能的去辨别类型进而判断出该用哪个函数 第二种情况同名函数的参数个数不同——函数的重载 由此可见同名函数的参数的个数不同可以构成函数的重载 第三种情况同名函数的形参类型顺序不同——函数的重载 需要注意的是形参的顺序不同需要满足同名函数的形参类型不能完全相同如下 如果这么写的话编译器也会不知道该调用哪个函数这叫做调用歧义 注意点返回值不可以作为函数重载的判断因为调用时也无法区分 小练习-:
判断下面代码是否构成函数的重载 namespace bit1
{void total(int pa, int pb){cout total(int pa, int pb) endl;}
}namespace bit2
{void total(int px, int py){cout total(int px, int py) endl;}
}
int main()
{bit1::total(3, 5);bit2::total(8, 8);
} 答案是否定的因为两个同名函数并不作用于同一作用域下所以并不构成函数的重载 2.引用的定义
在C中提出了“引用”的功能什么是引用呢 引用其实就是变量的别名 就相当于你们班有一个学习特别好的人数理化每次都是第一那么这个同学就会获得三个别名分别是“数学第一”“物理第一”“化学第一”当你说数学第一时大家知道你说的是他当你说物理第一时大家也知道你说的是他这就叫做别名 引用书写方法-: 我们知道学习C语言时 是取地址的意思难道在C中改变了吗 其实没有只有在你像图中这么使用时才会变为引用的意义 此时b为a的别名那么我们调用b的时候其实就是调用a 问题我们在创建别名时是开辟了新的空间吗 我们可以验证一下 我们发现b与a的地址一样所以在引用时并不会开辟新的空间只会创建一个“别名” 3.引用的一些常见问题 各位可以思考一下这种情况下a,b会交换吗 #includeiostream
using namespace std;
void Swap(int ta, int tb)
{int tmp ta;ta tb;tb tmp;
}int main()
{int a 100;int b 20;Swap(a, b);cout a b endl;
} 答案是会的为什么 我们先回到C语言时学习的交换在C语言中我们知道如果不传地址的话就无法改变两者的值因为形参是实参的一份临时拷贝swap函数会将a与b复制一份传给tatb这时候会开辟新的地址空间操作的是 ta 与 tb 但是这样却交换了首先我们知道除去变量名就是变量类型我们在形参中的变量类型是int类型这种类型本身就是引用是属于一个别名所以我们将a传过去时会将a的引用 传给形参实际上发生的是int ta a,int tb b 此时ta与tb就是别名而上述我们提到过引用是不会开辟新的空间的所以实际上操作的就是a与b 注意小点1-:
在使用引用的过程中我们也可以给别名引用起出别名的别名如下-: 注意小点2-:
在使用引用时必须进行初始化不可以说创建int后就扔掉了等一会有需要再用代码如下 注意小点3-:
一个变量可以有多个引用但一个引用只可以绑定一个变量 #includeiostream
using namespace std;int main()
{ int a 10;int b a;int c a;int l 100;c l;} 以上代码的含义是什么 A.让l赋值给C B.让c成为l的别名 答案是A引⽤⼀旦引⽤⼀个实体再不能引⽤其他实体所以这里是赋值 4.引用——权限的放大/缩小/平移 在C中存在权限的放大缩小以及平移的问题那么什么是权限的放大/缩小/平移呢 请看代码-: 个人认为权限的放大可以分为地址类与非地址类首先讲解非地址类 非地址类-: //非地址时//权限的平移int a1 10;int b1 a1;//权限的缩小int a2 100;const int b2 a2;//权限的放大const int a3 100;//int b3 a3; 这里是错误写法//正确书写 const int b3 a3;权限的平移合法-: 我们的变量a1是 int 类型的而引用的b1也是 int 类型的这说明类型的功能没有改变属于权限的平移 权限的缩小合法-: 我们的a2是 int 类型的而引用的b2是const int 类型的我们知道被const修饰后的变量只可以读不可以修改所以我们把一个既可以读又可以修改的变量取了一个只可以读不可以修改的别名这是属于权限的缩小是合法的 权限的放大非法-: 我们的a3是const int 类型的只可以读不可以修改但是如果我们运行了错误的写法 (int b3 a3),那么就把只能读不能改的变量取了一个即可以读又可以改的别名这样的话我们的b3是可以修改的但是b3是a3的别名我的本体不可以被修改我的分身却可以修改我这是权限的放大是非法的 地址类-: //地址情况int a1 10;//权限的平移int* p1 a1;int* pp p1;//权限的缩小int* pp1 a1;const int* p2 pp1;//权限的放大const int* p3 a1;int* p4 p3;int* p4 p3; 原理与上述相同但需要注意的是权限的缩小并没有运用到别名只是单纯的赋值这也说明权限的放大/缩小/平移并不只是单独存在于引用之中同时我们还需要注意一下写法 //权限的缩小int* pp1 a1;const int* p2 pp1;const int* p3 pp1; // 错误的写法 为什么因为它单纯触发了C中const的安全保障为了防治你用错间接修改上所以禁止使用 思考-: //这是权限的放大吗int a1 10;int b1 20;const int r1 a1 b1; 答案是是的因为a1b1得到的值是可以修改的而r1不可以修改所以这也是权限的放大 5. 不存在的空引用 在我们使用引用时是不可以实现空引用的如下-: 但是有一种写法是合法的-:如下 int* ptr NULL;int r *ptr;cout r endl; 只不过打印不出来什么 6.引用作为函数参数的速度之快代码体现 运行以下代码可以知道引用作为参数的运行快在哪里 #define _CRT_SECURE_NO_WARNINGS
#includeiostream
using namespace std;
struct A { int a[10000];
};
void TestFunc1(A a) {}
void TestFunc2(A a) {}
void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 clock();for (size_t i 0; i 10000; i)TestFunc1(a);size_t end1 clock();// 以引用作为函数参数size_t begin2 clock();for (size_t i 0; i 10000; i)TestFunc2(a);size_t end2 clock();// 分别计算两个函数运行结束后的时间cout TestFunc1(A)-time: end1 - begin1 endl;cout TestFunc2(A)-time: end2 - begin2 endl;
}int main()
{TestRefAndValue();return 0;
}我们可以发现不以引用作为参数的话那么在运行函数前就会重新开辟新的空间来作为临时变量这需要消耗大量的栈佂与时间 而如果用引用作为参数的话那么就不会开辟新的地址因为实际运行的是A a i;这属于引用创建的别名没有开辟新的空间正如上述所讲地址没有发生改变 7.引用的思考 int main()
{// 权限可以平移/缩小 不能放大double d 12.34;// 类型转换int i d;int r2 d;//报错const int r1 d;//不报错//r1不能修改dreturn 0;
} 我们知道在 int i d 时因为类型的不同所以它其实是有一个隐式类型转换的此时会将 d 复制一份并强制转化为 int类型 再赋值给 i 所以 i 其实是复制 d 的一份 int 类型的值 其次当我们使用int r2 d时因为d是double类型的r2是int类型的这里属于运算还是会存在隐式类型转换所以 r2 其实是 强制转化后的 d ,但是因为强制转化所生成的值是临时变量临时变量是不可修改的但是int r2是可以修改的这属于权限的放大所以是不对的 那为什么我们使用const int r1 d 时就不会报错呢这里其实还是会因为类型的不同而存在强制类型转化只要是运算就会存在强制类型转化此时d还是会被复制一份并强制转化为int类型而 r1 就是强制 int 类型的 d 的别名但是被const修饰了那就说明我们不可以对其进行修改值属于权限的平移也就不会报错如果你想打印 r1 的话你会发现打印出来的是 12