C++取经之路(其二)——含数重载,引用。

含数重载:

函数重载是指:在c++中,在同一作用域,函数名相同,形参列表不相同(参数个数,或类型,或顺序)不同,C语言不支持

举几个例子:

1.参数类型不同

cpp 复制代码
int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

2.参数个数不同

cpp 复制代码
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}

3.参数顺序不同

cpp 复制代码
void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

为什么只有c++支持?

我们知道在c/c++程序会经历,预处理,编译,汇编,链接这几个过程。

在c++程序链接的链接,符号表的生成和重定位会用修饰后的函数名去找。而C语言呢只会直接用函数名去找对应的函数

这是Linux系统,C语言和C++在对应编译器下生成的函数修饰名。

C语言:

C++:

可见C++的符号表在函数名后还加上了对应的参数

引用:

概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

cpp 复制代码
int main()
{
	int a = 10;
	int& b = a;    //引用的写法,只能说b是a的别名。
    b=20           //我们直接修改b也会修改a。
	cout << a;
	return 0;
}

对于为什么只能说b是a的别名?来举个栗子:张三有个外号叫小三,我们只能说小三是张三的外号,不能说张三是小三的外号。

权限放大:

引用也会涉及权限放大

比如:

这就是一个典型的权限放大,因为a是一个常量不能修改。b是一个变量是可以被修改的,这样写就会报错。

而不同的的类型也不能使用:

这样写也会报错。

引用的应用:

我们在开始学函数的时候,相信总是被,传值调用和传址调用困扰,什么是形参是实参的临时拷贝,到底要传什么?搞得头大。

我们直接来看这个:

cpp 复制代码
void Func(int& b)//取别名
{
	b = 20;
}

int main()
{
	int a = 10;
	Func(a);
	cout << a << endl;
	return 0;
}

我们只需要取一下别名,修改b,a也会直接被修改。

非常的好用!

相关推荐
fqbqrr10 分钟前
2508C++,支持rdma通信的高性能rpc库
c++·rpc
liulilittle42 分钟前
BFS寻路算法解析与实现
开发语言·c++·算法·宽度优先·寻路算法·寻路
喜欢吃燃面1 小时前
C++算法竞赛:位运算
开发语言·c++·学习·算法
草莓熊Lotso1 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
开发语言·c++·经验分享·笔记·其他
困鲲鲲1 小时前
CPP多线程2:多线程竞争与死锁问题
c++·多线程·死锁
快乐的划水a10 小时前
组合模式及优化
c++·设计模式·组合模式
星星火柴93611 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑12 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
阿巴~阿巴~14 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
旺小仔.15 小时前
双指针和codetop复习
数据结构·c++·算法