杭州思拓网站建设,职业培训机构资质,wordpress本地配置,南昌所有建设工程网站目录
一、引用
1.1引用的基本使用 1.2 引用注意事项
1.3 引用做函数参数
1.4 引用做函数返回值
1.5 引用的本质
1.6 常量引用
1.7引用和指针的区别
二、函数提高
2.1 函数默认参数
2.2函数占位参数
2.3 函数重载
2.4函数重载注意事项 一、引用
1.1引用的基本使用 …目录
一、引用
1.1引用的基本使用 1.2 引用注意事项
1.3 引用做函数参数
1.4 引用做函数返回值
1.5 引用的本质
1.6 常量引用
1.7引用和指针的区别
二、函数提高
2.1 函数默认参数
2.2函数占位参数
2.3 函数重载
2.4函数重载注意事项 一、引用
1.1引用的基本使用
作用 给变量起别名
语法 数据类型 别名 原名 引用是别名即为某个变量提供的另一个名字。一旦引用被初始化为一个对象它就不能被指向另一个对象。引用没有自己的内存地址它与所引用的对象共享同一块内存地址。
示例
int main()
{//引用基本用法//数据类型 别名 原名int a 10;//创建引用int b a;cout a a endl;cout a b endl;b 100;cout a a endl;cout b b endl;system(pause);return 0;
} 1.2 引用注意事项 引用必须初始化 引用在初始化后不可以改变
示例
int main() {int a 10;// 1.引用必须初始化// int b;//错误,引用必须要初始化 int b 20;// 2.引用在初始化后,不可以改变int c a; //一旦初始化后就不可以更改c b; //这是赋值操作不是更改引用cout a a endl;cout b b endl;cout c c endl;system(pause);return 0;
} 1.3 引用做函数参数
作用函数传参时可以利用引用的技术让形参修饰实参
优点可以简化指针修改实参
示例
// 引用做函数参数
//1. 值传递
void mySwap01(int a, int b) {int temp a;a b;b temp;
}
//2. 地址传递
void mySwap02(int* a, int* b) {int temp *a;*a *b;*b temp;
}
//3. 引用传递
void mySwap03(int a, int b) {int temp a;a b;b temp;
}
int main() {int a 15;int b 25;//mySwap01(a, b);//值传递,形参不会修饰实参//cout a: a b: b endl;//mySwap02(a, b);//地址传递,形参会修饰实参//cout a: a b: b endl;mySwap03( a , b );cout a: a b: b endl;system(pause);return 0;
} 总结通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单 1.4 引用做函数返回值
作用引用是可以作为函数的返回值存在的
注意不要返回局部变量引用
用法函数调用作为左值
示例
//引用做函数的返回值
//1.不要返回局部变量的引用
int test01() {int a 10; //局部变量存放在四区中的 栈区return a;
}int main() {//不能返回局部变量的引用int ref test01();cout ref ref endl;//如果第一次结果正确,是因为编译器做了保留cout ref ref endl;//第二次结果错误,因为a的内存已经释放system(pause);return 0;
}
//引用做函数的返回值
//2.函数调用可以作为左值(赋值符的左边是左值)
//返回静态变量引用
int test02() {static int a 20;//静态变量,存放在全局区,全局上的数据在程序结束后系统是否return a;
}int main() {//如果函数做左值那么必须返回引用int ref2 test02();cout ref2 ref2 endl;cout ref2 ref2 endl;test02() 1000;//如果函数的返回值是引用,这个函数调用可以作为左值cout ref2 ref2 endl;cout ref2 ref2 endl;system(pause);return 0;
}
1.5 引用的本质
本质引用的本质在c内部实现是一个指针常量.
讲解示例
//发现是引用转换为 int* const ref a;
void func(int ref) {ref 100; // ref是引用转换为*ref 100
}
int main() {int a 10;//自动转换为 int* const ref a; 指针常量是指针指向不可改也说明为什么引用不可更改int ref a;ref 20; //内部发现ref是引用自动帮我们转换为: *ref 20;cout a: a endl;cout ref: ref endl;func(a);// 调用func函数传递a的引用此时a的值会被修改为100return 0;
}引用的本质就是一个指针常量。 引用一旦初始化后就不可以发生改变。 结论C推荐用引用技术因为语法方便引用本质是指针常量但是所有的指针操作编译器都帮我们做了
1.6 常量引用
作用常量引用主要用来修饰形参防止误操作
在函数形参列表中可以加const修饰形参防止形参改变实参
示例
int main()
{//常量引用//使用场景用来修饰形参,防止误操作int a 10;const int ref 10;// 引用必须引一块的内存空间// 加上const之后 编译器将代码修改为 // int temp 10; const int ref temp;//ref 20;//加入const之后,变为只读,不可修改system(pause);return 0;
}
//引用使用的场景通常用来修饰形参
void showValue(const int v) {//v 10;cout v endl;
}int main() {const int ref 10;//ref 100; //加入const后不可以修改变量cout ref endl;//函数中利用常量引用防止误操作修改实参int a 10;showValue(a);system(pause);return 0;
} 1.7引用和指针的区别
对比了引用和指针在C中的基本性质、初始化要求、空值、操作灵活性、可复制性、安全性和取地址操作等方面的特点
特性引用 (Reference)指针 (Pointer)基本性质别名共享内存地址存储另一个变量地址的变量初始化要求必须初始化且不能更改所引用对象可以不初始化初始化后可更改指向空值不能指向空值可以指向nullptr或NULL操作灵活性类似普通变量无算术操作可进行算术操作改变指向地址可复制性不可复制不能重新赋值可复制可赋值安全性更高不易出错无空指针问题更易出错如空指针解引用取地址操作不能直接取引用对象的地址可以取指针本身的地址可解引用
总的来说引用和指针在语法和用法上有明显的区别。引用提供了更高级别的抽象和安全性但牺牲了灵活性而指针则提供了更低级别的操作和更大的灵活性但也需要更多的注意来避免潜在的问题。在设计程序时应根据具体需求和上下文来选择使用引用还是指针。
二、函数提高
2.1 函数默认参数
在C中函数的形参列表中的形参是可以有默认值的。
语法返回值类型 函数名 参数 默认值{}
示例
//函数默认参数
//在C中函数的形参列表中的形参是可以有默认值的。
//如果我们自己传入数据,就用自己的数据,如果没有,那么用默认值
//语法: 返回值类型 函数名(形参 默认值)
int func(int a, int b 10, int c 10)
{return a b c;
} //注意事项
//1. 如果某个位置参数有默认值那么从这个位置往后从左向右必须都要有默认值
//int func2(int a 10, int b, int c, int d 10) //error
int func2(int a, int b, int c, int d 10)
{return a b c;
}// 2. 声明和实现只能有一个默认参数
// (如果函数声明有默认值函数实现的时候就不能有默认参数)
// (如果函数实现有默认值函数声明的时候就不能有默认参数)
int func2(int a 10, int b 10);
int func2(int a, int b)
{return a b;
}int main() {//cout func(10) endl;cout ret func(20, 20) endl;cout ret func(100) endl;system(pause);return 0;
}
2.2函数占位参数
C中函数的形参列表里可以有占位参数用来做占位调用函数时必须填补该位置
语法 返回值类型 函数名 (数据类型){}
在现阶段函数的占位参数存在意义不大但是后面的课程中会用到该技术
示例
//占位参数
//返回值类型 函数名(数据类型){}//函数占位参数 占位参数也可以有默认参数
void func(int a, int) {cout this is func endl;
}int main() {func(10, 10); //占位参数必须填补system(pause);return 0;
}
2.3 函数重载
作用函数名可以相同提高复用性
函数重载满足条件 同一个作用域下 函数名称相同 函数参数类型不同 或者 个数不同 或者 顺序不同
注意: 函数的返回值不可以作为函数重载的条件
示例
//函数重载
//可以让函数名相同,提高服用型//函数重载的满足条件
//1.同一个作用域下
//2.函数名称相同
//3.函数参数类型不同,或者个数不同,或者顺序不同
void func()
{cout func 的调用 endl;
}
void func(int a)
{cout func (int a) 的调用 endl;
}
void func(double a)
{cout func (double a)的调用 endl;
}
void func(int a, double b)
{cout func (int a ,double b) 的调用 endl;
}
void func(double a, int b)
{cout func (double a ,int b)的调用 endl;
}//注意事项
//函数返回值不可以作为函数重载条件(无法重载仅按返回值类型区分的函数)
//int func(double a, int b)
//{
// cout func (double a ,int b)的调用 endl;
//}//根据不同的参数运行不同的代码片段
int main() {func();func(10);func(3.14);func(10, 3.14);func(3.14, 10);system(pause);return 0;
} 2.4函数重载注意事项 引用作为重载条件 函数重载碰到函数默认参数
示例
//函数重载注意事项
//引用作为重载条件
//函数重载碰到函数默认参数
//函数重载注意事项
//1、引用作为重载条件void func(int a) // int a 10; 不合法
{cout func (int a) 调用 endl;
}void func(const int a) //const int a 10; 合法
{cout func (const int a) 调用 endl;
}//2、函数重载碰到函数默认参数void func2(int a, int b 10)
{cout func2(int a, int b 10) 调用 endl;
}void func2(int a)
{cout func2(int a) 调用 endl;
}int main() {int a 10;func(a); //调用无constfunc(10);//调用有const//func2(10); //当函数重载碰到默认参数,出现二义性,报错,尽量避免这种情况//写函数重载的时候尽量不要写默认参数system(pause);return 0;
}
今天就先到这了 看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注
你们的点赞就是博主更新最大的动力 有问题可以评论或者私信呢秒回哦。