C++入门--函数重载、引用

目录

1.函数重载:

那么,为什么C++支持函数重载,C语言不支持呢?

2.引用


1.函数重载:

 定义:

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

                                        函数重载的类型

个数不同(在无参数和缺省参数,会发生调用报错,指向不明确)
类型不同
类型的顺序不同

1.类型不同

2.类型的顺序不同

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

void Swap(int* a, double *b) {
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void Swap(double* a, int* b) {
	double tmp = *a;
	*a = *b;
	*b = tmp;
}
int main() {
	int x = 5;
	int y = 1;
	double z = 2.37;
	double q = 5.39;
	Swap(&x, &z);

	Swap(&q,&y);

	return 0;
}

3.个数不同

如果是下面这张图,它们构成函数重载么?

如果它们构成函数重载,那么为什么会报错呢?

VS也明确告诉我们,指向不明确,所以会报错。

那么,为什么C++支持函数重载,C语言不支持呢?

我们需要从程序执行开始,需要进过预处理 - > 编译 - > 汇编 - > 链接等过程。那么问题就出现在这四个当中。

这里对这四者不做过多的介绍。我们以一个图简单了解这四者对程序分别做什么操作(以单链表为例)

如果我们将函数的定义和调用分离的情况(声明在A头文件,定义在B源文件,调用在C源文件)。在C源文件和B源文件链接的时候,C语言和C++对于函数的查找方法是不同的。C语言是按照函数的名字来查找,所以不能有重复的函数名。但是C++是按照修饰后的函数名来查找的。(至于怎么修饰,各个编辑器的修饰方法都不一致,一般都会把函数的名字和参数的类型标记上来查找)

C:

C++:

                注:观察时,需要将文件后缀改成 '.c' ,同时将B源文件中的函数定义注释掉。

也就是说,因为查找的方式不一样,所以造成了C语言不支持函数重载,C++支持函数重载。

2.引用

定义:

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。(这里共用内存的类型,和联合体有些类似。)(引用和指针类似,但是从代码角度,引用比指针好理解一些)

使用格式:

类型& 引⽤别名=引⽤对象;

注意点:

引用别名的权限需要和引用对象保持一直,或者低于引用对象。

与指针的异同点:

        1.语法概念上引⽤(p1)是⼀变量(x)的取别名不开空间,指针变量(*p1)是存储⼀个变量地址,要开空间。

注:为什么说语法概念上是这样的。因为在底层代码实际中,指针和引用一模一样。

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

        3.引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。(通过 const 修饰 *p1 或者修饰 p1 来指定谁修改,谁不修改)

        4.引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。

我们发现,虽然引用和指针作用相似,但他们仍然构成函数重载。

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

        6.指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。如果引用的对象已经被销毁,那么也会出问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值