#5. 函数重载
C语言中,假设我们有一个函数,叫做
int Add(int a,int b),这是一个加法函数,返回值为int类型,当我们想做double类型的两个数相加时,那么就要再写一个函数,并且重新起一个名字,不管是叫Add_double也好,还是叫什么,如果我们有多个加法函数,那么要起多少个名字?总之是给我们带来了不便,我们就想,能不能不改名字,还能找到这样的函数,C语言不可以,于是C++有了函数重载。
1、参数类型不同
#include <iostream> using namespace std; int Add(int a, int b) { return a + b; } double Add(double a, double b) { return a + b; } int main() { cout << Add(1314.0, 0.0); cout << Add(500, 20) << endl; return 0; }
2、参数个数不同
#include <iostream> using namespace std; void f() { cout << "我没有参数" << endl; } void f(int a) { cout << "哈哈,我有参数:" << a << endl; } int main() { f(); f(6); return 0; }
3、参数类型顺序不同
#include <iostream> using namespace std; int Add(int a, int b) { return a + b; } int Add(int a, int b, int c) { return a + b + c; } int main() { cout << "两个参数:>" << Add(1, 2) << endl; cout << "三个参数:>" << Add(1, 2, 3) << endl; return 0; }
#6. 引用
引用概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间
类型& 引用变量名(对象名) = 引用实体
int main() { int a = 6; int& b = a; cout << "a地址> " << &a << " b地址> " << &b << endl; return 0; }
所以b就是a的别名,好比你的大名和小名,不管叫那个都是你。
void Swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 1; int b = 2; Swap(&a, &b); cout << "a = " << a << " b = " << b << endl; return 0; }
void Swap(int& a, int& b) { int temp = a; a = b; b = temp; } int main() { int a = 1; int b = 2; Swap(a, b); cout << "a = " << a << " b = " << b << endl; return 0; }
引用特性
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
int main() { int a = 0; int& b = a; int& c = a; int& d = c; cout << a << b << c << d << endl; return 0; }
int main() { int a = 0; int b = 1; int& c = a; c = b; cout << c << endl; return 0; }
int main() { int a = 0; int b = 1; int& c = a; c = b; cout << c << endl; cout << "&a = " << &a << "\n&c = " << &c << "\n&b = " << &b << endl; return 0; }
常引用
const int a = 0; const int& c = a; const int& e = 10; //这是OK的 const double& d = a;
至于上面的const限定的为什么可以,我们先来看代码。
int main() { int a = 9; double c = a; return 0; }
这里为什么可以呢?
在强制类型转换时,会生成一个临时变量,将临时变量的值强制转换后在赋值。
使用场景
1. 做参数
我们上面的交换函数就是。
2.做返回值
int& Add(int a, int b) { static int c = a + b; return c; } int main() { int& a = Add(3, 5); cout << a << endl; a = 98; a = Add(a, 2); cout << a << endl; return 0; }
怎么会是98呢?不应该是100吗?
注意:static 修饰的变量只会初始化一次,再次调用时跳过初始化语句。
int& Add(int a, int b) { static int c; c = a + b; return c; } int main() { int& a = Add(3, 5); cout << a << endl; a = 98; a = Add(a, 2); cout << a << endl; return 0; }
那么问题是,我直接返回值不好吗,为什么要引用返回呢?
1.以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效 率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低.
引用和指针的区别
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
int main() { int a = 10; int& ra = a; cout << "&a = " << &a << endl; cout << "&ra = " << &ra << endl; return 0; }