当前位置: 首页 > news >正文

C++从入门到起飞之——缺省参数/函数重载/引用全方位剖析!

目录

1.缺省参数

2. 函数重载

3.引⽤

3.1 引⽤的概念和定义

3.2 引⽤的特性

3.3 引⽤的使⽤

3.4 const引⽤

3.5 指针和引⽤的关系

4.完结散花


 

                                                                                个人主页:秋风起,再归来~

                                                                                           C++从入门到起飞                         

                                                                       个人格言:悟已往之不谏,知来者犹可追

                                                                                        克心守己,律己则安!

1.缺省参数

• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数)

全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。

• 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。

• 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。

2. 函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。

1、参数类型不同构成重载

//1.参数类型不同构成重载
int Add(int a, int b)
{return a + b;
}double Add(double a, double b)
{return a + b;
}

 

 2、参数个数不同构成重载

//2.参数个数不同构成重载
void func()
{cout << "func()" << endl;
}void func(int a)
{cout << "func(int a)" << endl;
}

3、参数顺序不同构成重载

//3.参数顺序不同构成重载
double Add(int a, double b)
{return a + b;
}double Add(double a, int b)
{return a + b;
}

注意:返回值不同不能作为重载条件,因为调⽤时也⽆法区分  

4、调用时存在歧义的重载函数

void func3()
{cout << "func3()" << endl;
}void func3(int a=10)//给上缺省值
{cout << "func3(int a=10)" << endl;
}

两个函数构成重载,但是func3()调⽤时,会报错,存在歧义,编译器不知道调⽤谁  !

3.引⽤

3.1 引⽤的概念和定义

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋 ⻛";林冲,外号豹⼦头;

引用的定义:类型& 别名=引用对象

//引用的定义int a = 0;// 引⽤:b和c是a的别名int& b = a;int& c = a;// 也可以给别名b取别名,d相当于还是a的别名int& d = b;++d;// 这⾥取地址我们看到是⼀样的cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;

3.2 引⽤的特性

• 引⽤在定义时必须初始化

• ⼀个变量可以有多个引⽤(就比如一个人可以有多个别名)

• 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体(相当与一个别名只能一个人独有的,它不能再是其他人的别名

3.3 引⽤的使⽤

• 引⽤在实践中主要是于引⽤传参引⽤做返回值减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象。

//引用传参
void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}int main()
{int a = 10;int b = 20;cout << "交换之前" << endl;cout << "a=" <<a<<" b= "<<b << endl;swap(a, b);cout << "交换之后" << endl;cout << "a=" << a << " b=" << b << endl;return 0;
}

注意:至于为什么会减少拷⻉提⾼效率 ,是因为,C++规定,在函数传值传参或传值返回时,会先调用拷贝构造函数,生成临时变量,再进行传参(所以有拷贝消耗)。这点在后面类和对象内容部分会详细讲解!

• 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。

• 引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节 中会继续深⼊讲解。

引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。

3.4 const引⽤

• 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。

//常变量必须用常量引用
const int a = 10;
const int& b = a;//权限平移
//int& b = a;//权限变大,编译报错//普通变量既可以用普通引用
int c = 10;
int& d = c;//权限平移//也可以用const引用
const int& e = c;//权限缩小

• 不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场 景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对 象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。

• 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。

3.5 指针和引⽤的关系

C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功 能有重叠性,但是各有⾃⼰的特点,互相不可替代。

• 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间

• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的

• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。 • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。

• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)

 • 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

4.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

​​​​

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python为什么慢?(自用)
  • 软件建模概要
  • Vagrant配合VirtualBox搭建虚拟机
  • 设计模式8-桥模式
  • Windows之nslookup命令
  • 图解数据结构---绪论
  • # Redis 入门到精通(一)数据类型(4)
  • 创建yum源、NFS共享存储
  • C++惯用法: 通过std::decltype来SFINAE掉表达式
  • 有关去中心化算路大模型的一些误区:低带宽互连导致训练速度太慢;小容量设备无法生成基础规模的模型;去中心化总是会花费更多;虫群永远不够大
  • 内容协商源码解析与自定义 MessageConverter
  • 100个C++面试题
  • C#实现Winform程序右下角弹窗消息提示
  • Web组成架构
  • Spring Boot项目中JPA操作视图会改变原表吗?
  • @jsonView过滤属性
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JAVA SE 6 GC调优笔记
  • jQuery(一)
  • JS 面试题总结
  • leetcode46 Permutation 排列组合
  • Markdown 语法简单说明
  • mysql 5.6 原生Online DDL解析
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 安装python包到指定虚拟环境
  • 产品三维模型在线预览
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 大型网站性能监测、分析与优化常见问题QA
  • 汉诺塔算法
  • 实习面试笔记
  • 新版博客前端前瞻
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 原生 js 实现移动端 Touch 滑动反弹
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • puppet连载22:define用法
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​configparser --- 配置文件解析器​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (汇总)os模块以及shutil模块对文件的操作
  • (七)glDrawArry绘制
  • (算法)N皇后问题
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)详解PHP处理密码的几种方式
  • .CSS-hover 的解释
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET4.0并行计算技术基础(1)
  • .Net多线程总结
  • /*在DataTable中更新、删除数据*/
  • @angular/cli项目构建--Dynamic.Form