在网上做国际快递淘宝网站,全国最好的广告公司加盟,什么网站可以做excel表格,长沙营销推广C入门基础#xff08;2#xff09; 1.缺省函数2.函数重载3.引用3.1 引用的概念和定义3.2 引用的特性3.3 引用的使用3.3.1引用的特性 4 .const引用5. 指针和引用的关系6.inline 1.缺省函数
• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时#xf… C入门基础2 1.缺省函数2.函数重载3.引用3.1 引用的概念和定义3.2 引用的特性3.3 引用的使用3.3.1引用的特性 4 .const引用5. 指针和引用的关系6.inline 1.缺省函数
• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时如果没有指定实参则采⽤该形参的缺省值否则使用指定的实参缺省参数分为全缺省和半缺省参数。有些地方把缺省参数也叫默认参数 • 全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。 • 带缺省参数的函数调用C规定必须从左到右依次给实参不能跳跃给实参。 • 函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现规定必须函数声明给缺省值。 2.函数重载
C支持在同⼀作用域中出现同名函数但是要求这些同名函数的形参不同可以是参数个数不同或者类型不同。这样C函数调⽤就表现出了多态行为使⽤更灵活。C语言是不支持同⼀作用域中出现同名函数的。
#includeiostream
using namespace std;
// 1、参数类型不同int Add(int left, int right)
{cout int Add(int left, int right) endl;return left right;
}
double Add(double left, double right)
{cout double Add(double left, double right) endl;return left right;
}
// 2、参数个数不同
void f()
{cout f() endl;
}
void f(int a)
{cout f(int a) endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{cout f(int a,char b) endl;
}
void f(char b, int a)
{cout f(char b, int a) endl;
}
// 返回值不同不能作为重载条件因为调⽤时也⽆法区分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}
// 下⾯两个函数构成重载
// f()但是调⽤时会报错存在歧义编译器不知道调⽤谁
void f1()
{cout f() endl;
}
void f1(int a 10)
{cout f(int a) endl;
}
int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, a);f(a, 10);return 0;
}3.引用
3.1 引用的概念和定义
引用不是新定义⼀个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同⼀块内存空间。比如水壶传中李逵宋江叫铁牛江湖上人称⿊旋风林冲外号豹子头。 但这里要注意的是引用的符号和取地址的符号一样。
3.2 引用的特性
引用在定义时必须初始化引用在定义时必须初始化引用一旦引用⼀个实体再不能引用其他实体
3.3 引用的使用
3.3.1引用的特性
语法简洁性 引用传参使用符号声明引用语法简洁直观。在函数调用时不需要额外的解引用操作直接使用变量名即可。 指针传参需要使用符号声明指针并在函数体内通过解引用来访问指针指向的值。这种额外的操作增加了代码的复杂性。 2. 安全性 引用传参一旦引用被初始化它就始终指向同一个对象且不能为空。这避免了空指针异常的风险增加了程序的安全性。 指针传参指针可以为空且可以在函数中被重新赋值指向其他对象。因此在使用指针时需要更加小心以避免空指针异常和野指针问题。使用方便性 引用传参在函数定义和调用时直接使用变量名即可无需考虑指针的解引用和空指针检查等问题。这使得代码更加易读和易维护。 指针传参在函数内部如果需要修改指针指向的值还需要使用解引用操作符*。此外如果函数需要返回指针还需要考虑指针的生命周期和内存管理问题这增加了代码的复杂性。语义明确性 引用传参通过引用传递参数可以清晰地表达函数将直接修改传入参数的值而不是其副本。这种语义上的明确性有助于提高代码的可读性和可维护性。 指针传参虽然指针也可以实现相同的功能但其语义上可能不够直观。特别是在复杂的代码结构中指针的使用可能会让其他开发者难以理解函数的意图。
4 .const引用
可以引用⼀个const对象但是必须⽤const引用。const引⽤也可以引用普通对象因为对象的访问权限在引用过程中可以缩小但是不能放大 。C规定了临时变量是具有常性的所以这里也要用const去修饰。所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象C中把这个未命名对象叫做临时对象。 这里通过使用 const 引用你告诉编译器这个引用不会修改它所引用的对象。这使得编译器能够放宽类型匹配的要求因为即使进行了类型转换从 double 到 int由于 const 保证了不会通过引用修改值所以这种转换是安全的。编译器会隐式地将 double 类型的值转换为 int 类型的值通过截断小数部分并将这个转换后的值“视为”一个 const int 类型的临时对象然后让 const int l 引用这个临时对象。
5. 指针和引用的关系 指针和引用既有重叠的部分也有不一样的地方他们各有自己的特色都不能互相替代。
语法概念上引用是⼀个变量的取别名不开空间指针是存储⼀个变量地址要开空间。引用在定义时必须初始化指针建议初始化但是语法上不是必须的。引⽤在初始化时引⽤⼀个对象后就不能再引⽤其他对象而指针可以在不断地改变指向对象。引⽤可以直接访问指向对象指针需要解引用才是访问指向对象。 -sizeof中含义不同引⽤结果为引⽤类型的大小但指针始终是地址空间所占字节个数(32位平台下占4个字节64位下是8byte)指针很容易出现空指针和野指针的问题引用很少出现引用使用起来相对更安全⼀些。
6.inline
⽤inline修饰的函数叫做内联函数编译时C编译器会在调⽤的地⽅展开内联函数这样调⽤内联函数就需要建⽴栈帧了就可以提⾼效率。 • inline对于编译器⽽⾔只是⼀个建议也就是说你加了inline编译器也可以选择在调⽤的地⽅不展开不同编译器关于inline什么情况展开各不相同因为C标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数对于递归函数代码相对多⼀些的函数加上inline也会被编译器忽略。 • C语⾔实现宏函数也会在预处理时替换展开但是宏函数实现很复杂很容易出错的且不⽅便调试C设计了inline⽬的就是替代C的宏函数。 • vs编译器debug版本下⾯默认是不展开inline的这样⽅便调试debug版本想展开需要设置⼀下以下两个地⽅。 • inline不建议声明和定义分离到两个⽂件分离会导致链接错误。因为inline被展开就没有函数地址链接时会出现报错。