【开懂C++】new 引用 函数重载

💽作者@:匿名者Unit
💽专栏:《C++:开懂》

一.new和delete运算符

new的使用方法和效果都与C语言的malloc相似,都是在内存堆区中申请内存,比如说我想申请10个类型为int大小的空间 如何编写呢:

int* p= new int(10);

与malloc不同的是在接收返回值时new不需要使用强制转换为自己想要的指针类型,编译器会根据你开辟空间的数据类型来返回那种类型的地址。
另一点与malloc不同的,new可以直接开辟数组,而malloc是间接开辟,不是那么直观,格式是怎样的呢:

int* arr= new int[10];

delete运算符
与malloc一样,new也有为释放堆区开辟空间的运算符----delete运算符,功能与free相似,书写上有所区别:

delete p;
delete[] arr;

二.C++中的引用

1.引用的概念

在C++中有如此规定,引用可以给变量的名字起一个别名

int a=10;
int &b=a;

这个的b就是a的一个别名,通过b可以自由的使用a。但是有两点
需要注意的 1.引用必须初始化,也就是说int &b;如此的引用定义是错误的,在使用引用时就必须初始化2.引用一旦初始化就不可以更改,就是说int a=10; int &b=a;b已经代表了a,不可以再代表其他变量。

2.引用的应用。

那引用有什么应用呢,我们在C语言函数部分学习过,想函数传参有传值传址两种方式,在经典例子交换两数值的函数中,我们得知传值时,形参只是实参的一份临时拷贝,即使交换了形参的值,也不会改变实参。而传址调用将会使得形参可以通过实参的地址修改实参的数值。
其实在函数传参时,我们还可以使用引用的方式来传参:

void my_swap(int &x, int &y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 12;
	int b = 32;
	my_swap(a, b);
	cout << " a= " << a << endl;
	cout << " b= " << b << endl;
	return 0;
}

如上使用引用的方式接受实参,同样可以交换实参的值。
讨论完形参使用引用后,我们再来说一下当函数返回类型为引用时,有哪些注意事项把:
1.不能返回局部变量的引用

int& test()
{
	int a=10;
	return a;//不能返回局部变量的引用
}
int main()
{
	int &ret-test();
	return 0;
}

上图的操作其实是说不通的,变量a在函数test结束后就会自动销毁,所以ret找到的地址也就是非法的一块地址了,是不是感觉引用和指针非常想呢
2.当返回引用时函数可以作为左值

int& test2()
{
	static int a = 10;//static静态变量
	return a;
}
int main()
{
	int& ret = test2();
	test2() = 20;//当返回引用时函数可以作为左值
	cout << " ret =" << ret << endl;
}

3.引用的本质

通过上面的介绍,我们是时候揭开引用的神秘面纱了,其实在C++内部,引用本质就是一个指针常量。可见C语言的底层性。
指针常量

int *const p;

也就是一个指针可以通过指向的地址修改内容,但是不可以指向其他的地址
例如我们之前写的代码int a=10; int &b=a; 实质上也等于这个代码int a=10;int *const b =&a;就是这个样子的。
我们再讲解一个例子来理解引用:

int main()
{
	int &a=10;
	const int &a=10;
}

上图代码中int &a=10; 其实是错误的,因为他本质是int *const a=10;显然是将10当做了地址指针常量a指向了地址10.这就造成了非法访问。
const int &a=10; 这样书写则是可以的,因为编译会帮你将代码改为int tmp=10; const int &a =tmp;

三.函数重载

1.站位参数和默认参数

默认参数
在函数的参数中可以只有数据类型和变量名也可以为形参赋上初始值,也就是所谓的默认参数

int func(int a, int b=20, int c=30)
{
	return a + b + c;
}
int main()
{
	int ret=func(10, 20, 30);
	return 0;
}

而对于默认参数有几点注意事项需要注意1. 函数的默认参数,如果我们向形参传入数据则使用我们传入的数据,否则使用默认参数
2.形参中如果一个参数有了默认参数,在他右边的参数也必须有默认参数
3.函数的声明和实现不可以同时有默认参数
站位参数
站位参数的概念比较简单,就是在函数的参数列表中只写上数据类型,没有变量名,例如:

int func(int a, int)
{
	;
}

如上func就有一个占位参数

2.函数的重载

首先了解重载的条件:1.在同一作用域下2.函数名称相同3.函数参数类型不同,或者个数不同,或者顺序不同。例如:

void func(int a)
{
	cout << "(int a)的调用" << endl;
}
void func(double a)
{
	cout << "(double a)的调用" << endl;
}
void func(int a,double b)
{
	cout << "(int a,double b)的调用" << endl;
}
void func(double a, int b)
{
	cout << "(double a, int b)的调用" << endl;
}


int main()
{
	func(3.14,5);
	func(2);
	func(3.14);
	func(5,3.14);
	return 0;
}

我们就可以通过函数的重载,在主函数中向函数传入不同的参数,来使用不同的函数
注意事项:当函数重载遇上默认参数时可能会出错:

void func(int a, int b = 10)
{
	cout << "(int a)的调用" << endl;
}
void func(int a)
{
	cout << "(int a)的调用" << endl;
}
int main()
{
	func(10);
	return 0;
}

像这样的代码,对函数重载的调用就会出错

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aomnitrix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值