怎样用模板做网站,广告传媒公司加盟代理,西安网站建设设计的好公司排名,成都专业网站建设价格低一、函数重载 1、什么是函数重载#xff1f; 在同一作用域下#xff0c;函数名相同#xff0c;参数列表不同的函数构成重载关系 函数重载与返回值类型、参数名无关 与作用域是否相同#xff0c;以及参数列表的数量、参数类型、常属性不同等有关 2、C是如何实现函数重载的 在同一作用域下函数名相同参数列表不同的函数构成重载关系 函数重载与返回值类型、参数名无关 与作用域是否相同以及参数列表的数量、参数类型、常属性不同等有关 2、C是如何实现函数重载的 通过g -S 生成汇编代码可知编译器会把函数的参数类型进行缩写后追加到函数名的末尾形成新的函数名既是进行了换名操作从而确保编译结果函数名不重复 3、extern C 因为通过C编译器编译函数、调用语句时会变成换名后的名字但是项目中有可能需要去调用已经通过C编译器编译好的函数它们是没有换名的因此会调用失败 因为大部分情况下C编译好的文件无法重新使用C编译器编译所以只能想办法让C编译器在调用C编译的函数时不要换名 通过 extern C{xxx} 让C编译器按照C语言的格式编译函数从而让调用语句与被调用函数名同名这样就可以正确地调用C标准库、系统函数 4、重载和隐藏 在同一作用域下函数名相同参数列表不同的函数构成重载关系 在不同作用域下同名函数构成了隐藏 5、参数类型不匹配 当调用函数时编译器会优先调用类型最匹配最精确的版本函数如果没有最正确的则会先做类型转换后再匹配但如果没有能够进行类型转换匹配的版本最后也会报错 但是不建议通过类型转换去调用函数因为转换情况与编译器有关 二、默认形参 1、什么是默认形参 在C中可以给函数的参数设置默认值当函数被调用时如果调用者提供了实参则使用实参调用如果没有提供则使用默认值调用 2、默认形参要靠右 如果函数有多个参数并设置了默认形参要遵循从右往左依次设置默认形参 3、只能在函数声明中设置默认形参 如何函数声明与定义分开实现只能在函数声明中设置默认形参否则语法错误 4、默认形参可能会影响函数重载 如果对函数进行了重载又设置了默认形参调用时可能会有冲突和歧义调用失败 因此对于重载过的函数设置默认形参时一定要谨慎 三、内联函数 1、普通函数 普通函数会被编译成二进制指令存储在代码段中调用语句会生成一条跳转指令当程序运行到调用语句时会跳转该函数在代码段中对应的位置执行执行结束会返回 2、什么是内联函数 内联函数也会被翻译成二进制指令但调用语句不会生成跳转指令而是直接把内联函数的二进制指令进行替换就没有跳转和返回而是直接执行二进制指令这种函数称为内联函数 3、显式内联和隐式内联 显式内联 在函数的返回值前加 inline 该函数就以内联函数的机制调用 隐式内联 在结构、联合、类中的成员函数会自动被当做内联函数处理 注意如果在结构、联合、类中声明成员函数但是在外面定义则不会当做内联函数处理 注意函数是否被内联由编译器以及它的优化等级决定加 inline 只是有可能影响它的决定 注意g默认优化等级 -O -O1 下所有的内联函数都会当成普通函数处理 在-O2 -O3的优化级别下甚至普通函数都可能会被当做内联函数处理 注意 c99 也支持 inline 4、内联的适用条件 优点节约了函数传参、跳转、返回的时间提高代码的运行速度 缺点当被多个位置调用时那么二进制指令会被拷贝多份产生了冗余导致可执行文件明显增加 适用条件 1、适合内容简单且同一位置频繁调用的函数 2、不适合内容多、且多个位置、较少调用的函数因为节约的时间还弥补不过牺牲的空间 3、带有递归属性的函数无法内联编译器会自动忽略 5、内联函数和宏函数的相同点和不同点 相同点都是采用以空间换时间的策略提高程序的运行速度减少函数调用跳转的耗时 不相同 1、宏函数不是真正的函数只是语句替换不会对参数进行类型检查、没有返回值、安全性低 2、内联函数是真正的函数、严格检查参数类型、有返回值、安全性高 四、引用 什么是引用引用就是一种取别名的机制 为什么要使用指针 1、跨函数共享变量(输出型参数)引用可替代 //06 2、提高传参效率引用可替代效率比指针还高不拷贝字节 3、配合堆内存使用只能使用指针 4、配合字符串使用string类可以替代 引用使用格式 类型名 别名 数据; //类型名 别名变量名 数据是常量 所以要加const保护 什么情况下使用引用 1、跨函数共享变量引用比指针更安全(无需直接操作地址空间、不存在空引用也极少出现野引用问题)、也比指针更方便(无需缺地址、解引用) 2、提高传参效率引用的效率比指针还高指针最起码还要传递4/8字节的地址编号但是引用一个字节都不需要传递但是引用和指针一样都有被修改的风险因此为了保护目标需要增加const 使用引用需要注意的问题 1、引用必须初始化所以不存在空的引用 2、可以引用右值但是必须使用const修饰引用 3、引用不能中途更改引用的目标 4、函数的返回值类型可以是引用类型但不能返回局部变量的引用 指针与引用的相同点和不同点 相同点 1、都可以跨函数共享内存都可以提高函数传参效率、也需要const保护 2、可以定义数组指针也可以定义数组引用 int arr[5] {1,2,3,4,5}; int (*arrp)[5] arr; int (hehe)[5] arr; 3、可以定义函数指针可以定义函数引用 void (*fp)(void) func; fp(); void (xixi)(void) func; xixi(); 不同点 1、引用是一种取别名的机制指针是一种数据类型 2、引用不需要额外存储空间指针需要4/8字节用于存储内存地址 3、指针可以不初始化引用必须初始化 4、指针有空指针但没有空引用 5、指针可以更改指向的目标但引用不可以 6、指针可以配合堆内存使用而引用不行 7、可以定义指针数组但不能定义引用数组 五、C的强制类型转换 C语言原来的强制类型转换依然可以在C中继续使用 (新类型)数据 注意强制类型转换都只是得到一个临时结果数据原来的类型不会改变 为什么C要重新设计强制类型转换 因为C语言的强制类型转换虽然自由度高但是非常危险没有任何要求限制 为什么C之父设计强制类型转换设计得很复杂、使用很麻烦 因为他认为只有在程序设计不合理的情况下才需要强制类型转换之所以设计复杂就是不想让程序员使用而是去反思、重新设计自己的代码 1、静态类型转换 static_cast目标类型(原数据) 目标类型和原数据类型之间必须有一个方向能够自动类型转换否则出错 //比如int和int*之间就不能 2、动态类型转换 dynamic_cast目标类型(原数据) 目标类型和原数据类型之间必须存在继承关系并且目标类型必须是指针类型或引用类型否则出现错误 3、去常类型转换 const_cast目标类型(原数据) 目标类型必须是指针或引用且除了const属性不同其它都要相同否则出现报错 4、重解释类型转换 reinterpret_cast目标类型(原数据) 只能把整数转成指针或者把指针转成整数否则会出错