生产类营销型网站怀来网站seo
生产类营销型网站,怀来网站seo,四川城乡和住房建设厅官方网站,网站专业是学什么函数重载
函数重载概念
什么是函数重载#xff1f; 函数重载#xff1a;是函数的一种特殊情况#xff0c;C允许在同一作用域中声明几个功能类似的同名函数#xff0c;这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同#xff0c;常用来处理实现功能类似数据类… 函数重载
函数重载概念
什么是函数重载 函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题。 下面以参数个数类型类型顺序分别举例介绍 1参数类型不同 int add(int a, int b) { return a b; } double add(double a, double b) { return a b; } 2参数个数不同 void fun() { cout fun() endl; } void fun(int a) { cout fun(a) endl; } 3类型顺序不同 void f(char a, int b) { cout f(char a,int b) endl; } void f(int a, char b) { cout f(int a,char b) endl; } 在函数调用时c会通过判断输入的参数类型参数个数参数顺序自动寻找相匹配的函数进行调用。
注意
只有满足上面的条件的才是函数重载如果两个函数的参数类型个数顺序都相等只有返回值类型不一样这不构成重载运行会报错。 int add(int a, int b) { return a b; } double add(int a, int b) { double c 1.0; return c; } 引用
引用概念
引起简单的讲就是给一个存在的变量取个别名 比如你有一个大名但是在家里你的家人会习惯性的喊你的小名不管怎么喊他们说的都是你自己。
使用方法
类型 引用变量名对象名引用实体 int a 0; //引用b是a的别名 int b a; int c b; cout a a endl; cout b b endl; cout c c endl; c; cout a a endl; cout b b endl; cout c c endl; a,b,c都是同一个变量的不同变量名它所指向的都是同一个内存地址 注意
引用类型必须和引用实体是同种类型的
引用特性 1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 引用一旦引用一个实体再不能引用其他实体 (1)初始化: int x 0; int y;//没有初始化就会报错 就好比你喊一个别名但是你不知道这个别名到底是谁的也不知道自己喊得是什么。 (2)多个引用 int a 0; int b a; int c b; //引用b是a的别名,c也是a的别名 (3)不能引用多个实体 int a 1; int b 2; int c a; int c b; //如果引用多个实体c是a的别名c也是b 的别名那么a和b应该指向同一个地址但事实是a,b为两个不同变量相矛盾所以引用一旦引用一个实体再不能引用其他实体 常引用 常引用其实2就是权限问题
权限可以缩小但是不可以放大
权限的放大 const int m 0; int n m; m的权限的只读n是m的别名n的权限的可读可写不行 你有洁癖在宿舍床上你自己也只能脱了鞋子才能上床但是你室友却直接躺你床上不脱鞋子这可以吗肯定是不行的 const int n m; //这样写是可以的 权限的缩小 int m 0; const int n m; 你在你床上可以穿着鞋躺着然后你的室友想在你床上坐一下这肯定是可以的 传值、传引用效率比较 以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 引用和指针的区别
在语法概念上引用就是一个别名没有独立空间和其引用实体共用同一块空间。 int a 10; int b a; cout a endl; cout b endl; 在底层实现上实际是有空间的因为引用是按照指针方式来实现的 int a 10; int b a; b 20; int* p a; *p 30; 引用和指针的不同点: 1. 引用概念上定义一个变量的别名指针存储一个变量地址。 2. 引用在定义时必须初始化指针没有要求 3. 引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何 一个同类型实体 4. 没有NULL引用但有NULL指针 5. 在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32 位平台下占4个字节) 6. 引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小 7. 有多级指针但是没有多级引用 8. 访问实体方式不同指针需要显式解引用引用编译器自己处理 9. 引用比指针使用起来相对更安全 内联函数
内联函数概念
以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率。 int add(int a, int b) { return a b; } int main() { int t 0; tadd(1, 2); } 反汇编 如果增加inline关键字将其改成内联函数在编译期间编译器会用函数体替换函数的 调用。 inline int add(int a, int b) { return a b; } int main() { int t 0; tadd(1, 2); } 反汇编 注意
1在debug模式下需要对编译器进行设置否则不会展开(因为debug模式下编译器默认不会对代码进行优化
设置 2inline函数的定义和声明不用分离分离会导致链接错误。 链接错误main.obj : error LNK2019: 无法解析的外部符号 void __cdecl f(int) (?fYAXHZ)该符号在函数 _main 中被引用 3内联函数多用于规模较小流程直接频繁调用的函数 auto关键词
auto基本介绍
在C11中auto是用来自动推导表达式或变量的实际类型的。
auto e; 无法通过编译使用auto定义变量时必须对其进行初始化
比如 根据上面的例子我们可知
auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编译期会将auto替换为变量实际的类型。 当然随着程序越来越复杂程序中用到的类型也越来越复杂经常体现在1. 类型难于拼写 2. 含义不明确导致容易出错
比如std::mapstd::string, std::string::iterator it m.begin(); 这里的std::mapstd::string, std::string::iterator是一个类型但是该类型太长了特别容 易写错我们就可以用auto代替
auto it m.begin(); auto使用细则
1auto与指针和引用结合起来使用
用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须 加 int main() { int x 10; auto a x; auto* b x; auto c x; cout typeid(a).name() endl; cout typeid(b).name() endl; cout typeid(c).name() endl; *a 20; *b 30; c 40; return 0; } 2在同一行定义多个变量
当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译 器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。 void TestAuto() { auto a 1, b 2; auto c 3, d 4.0; // 该行代码会编译失败因为c和d的初始化表达式类型不同 } auto不能使用的情况 1. auto不能作为函数的参数 2.auto不能直接用来声明数组 补充知识点
我们平常遍历数组时使用的是
for(int i0;isizeof(a)/sizeof(a[0]);i)
知道了auto关键字我们就可以
for(auto i:a)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89242.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!