初阶C++(二)

初阶C++(二)

1. 重载函数

(一)对于重载函数的理解

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者

类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同

名函数的。

(二)重载函数分类

其中分为多种, 其一则是:

cpp 复制代码
//1:参数类型不同
int Add(int x, int y)
{
	cout << "int Add(int x, int y)" << endl;
	return x + y;
}

double Add(double left, double right)
{
	cout << "double Add(double left,double right)" << endl;
	return left + right;
}

第二种则是:

cpp 复制代码
//2:参数个数不同
int Add(int x, int y)
{
	cout << "int Add(int x,int y)" << endl;
}

int Add(int x)
{
	cout << "int Add(int x)";
}

然后再是:

cpp 复制代码
//3:参数顺序不同
int cwz(char x, int y)
{
	cout << "int cwz(char x,int y)" << endl;
}

int cwz(int x, char y)
{
	cout << "int cwz(int x,char y)" << endl;
}

但是有一种情况是不算做重载函数:
返回类型的不同

2.引用

(一) 引⽤的概念和定义

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,
它和它引⽤的变量共⽤同⼀块内存空间。如:周树人被称作为""鲁迅"、孙悟空被称作为"斗战神佛"...
C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的<< 和 >>,这⾥引⽤也和取

地址使⽤了同⼀个符号&,⼤家注意使⽤⽅法⻆度区分就可以


接下来就是对引用的定义-------

cpp 复制代码
#include<iostream>
using namespace std;
int main()
{
//用b、c、d来引用a
	int a = 0;
	int& b = a;
	int& c = a;
	int& d = a;
	d++;
 
 //打印地址
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	cout << &d << endl;
}

我们来逐步分析--------

第一步调试:

如图所示:b、c、d成功的引用了a,当d++的时候a、b、c、d都会改变,因为他们都是表示a这个变量

最后打印他们的地址得出是一样的

##(二) 引用特性

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

• ⼀个变量可以有多个引⽤

• 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

(二)引用的使用

对于引用的简单运用:

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

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

比如实现一个交换函数:

cpp 复制代码
#include<iostream>
using namespace std;
void swap(int& x, int& y)//在这里采用引用
{
	int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	swap(a, b);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	return 0;
}

(三)const引用

对于const引用了解-----------

• 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访

问权限在引⽤过程中可以缩⼩,但是不能放⼤。

• 不需要注意的是类似 int& rb = a3; double d = 12.34; int& rd = d; 这样⼀些场
景下a
3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对

象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥

就触发了权限放⼤,必须要⽤常引⽤才可以。

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

C++中把这个未命名对象叫做临时对象。

例如:

在const修饰下a,却想要用引用来是的a的值改变

(权限放大)<这是不能的>

cpp 复制代码
int main()
{
	const int a = 10;
	int& x = a;//这很显然是错的《放大了a的权限》
	const int& x = a;//必须这样才行
}

权限缩小<这是可以的>

cpp 复制代码
int main()
{
    int a = 10;
	const int& x = a;缩小了a的权限
}

转换成别的类型的数也要用const来修饰

cpp 复制代码
#include<iostream>
using namespace std;
int main()
{
int a = 10;
const int& ra = 30;
// 编译报错: "初始化": ⽆法从"int"转换为"int &"
// int& rb = a * 3;
const int& rb = a*3;//这里是临时变量,临时变量具有常数性,那么就要用const来修饰
double d = 12.34;
// 编译报错:"初始化": ⽆法从"double"转换为"int &"
// int& rd = d;
const int& rd = d;
return 0;
}

初阶C++(二)到此结束,感谢大家观看! ! !

相关推荐
天天扭码5 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶5 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
我们的五年9 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
FIN技术铺10 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
zwjapple16 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five17 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序17 分钟前
vue3 封装request请求
java·前端·typescript·vue
前端每日三省19 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
凡人的AI工具箱32 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜35 分钟前
django+boostrap实现发布博客权限控制
java·前端·django