目录
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.指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。如果引用的对象已经被销毁,那么也会出问题。