1、函数的定义与声明
(1)定义
int add(int a,int b) { int c = a+b; return c; }
明确了函数接受什么参数,返回什么值,具体进行什么操作(实现)
(2)声明
int add(int a,int b);
明确了函数接受什么参数和返回什么值(比如上面的int指明返回值类型)
2、指针传参
实质就是指针的值传参
#include <iostream> using namespace std; void swap(int* pa, int* pb) { int temp = *pa; *pa = *pb; *pb = temp; } int main() { int m = 10, n = 20; int* pm = &m, * pn = &n; swap(pm, pn); cout << m << endl << n; }
指针的值是地址,实际上就是pm和pn对pa和pb的值传参
可以看到m和n的值已被交换
3、引用
特指左值引用,即给一个已经有名字的变量起别名,不能存在空引用。
#include <iostream> using namespace std; int main() { int a = 10; int &b = a, &c = b; cout << b << endl; //b是a的一个引用(别名),输出b就相当于输出a的值 c++; //c是a的一个引用(别名),c自增就是a自增 cout << a; }
可以理解为变量b和c的类型为int & ,叫做整形引用
输出结果如下:
4、函数的引用传参
即形参就是实参的一个别名
#include <iostream> using namespace std; void swap(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int m = 10, n = 20; swap(m, n); cout << m << endl<<n; }
同样实现了m和n的交换,且代码更简洁
5、函数重载 overlord
多个函数名字相同,参数列表(数量、类型)不同
(1)参数数量不同
#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); }
根据输出我们可以看出,尽管函数名都为add,但编译器会根据实参的数量自动匹配调用哪个函数
(2)参数类型不同
#include <iostream> #include <string> using namespace std; int myadd(int a, int b) { return a + b; } string myadd(int a,string b) { return to_string(a) + b; } int main() { cout << myadd(123, 456) << endl; cout << myadd(123, "abc"); }
同样,编译器根据实参类型自动匹配需要调用的函数
这里说明一下:
C++中 的 "to_ string " 函数 用于将数字转换为字符串
要使用这个函数只需 #include <string>
6、避免overlord歧义
不允许仅有返回值不同的函数重载,重载是针对参数列表的。
比如:
#include <iostream> #include <string> using namespace std; int my(int a, int b) { return a + b; } string my(int a,int b) { return to_string(a) + to_string(b); } int main() { cout << my(123, 456) << endl; cout << my(123, 456); }
可以看到编译器报错了,这样是无法重载的!
overlord与返回值无关,只要满足
声明时:名字相同;参数列表不同
调用时:不产生匹配歧义
7、内联函数inline
首先要明确一点,inline只是建议,
并不是写了inline关键字就一定会被内联,要看编译器是否采纳;
其次,内联这个动作发生在编译时,是为了提升运行时的效率。
8、其他总结
(1)默认参数应放在形参列表最后面,设置参数默认值时应从右向左
比如:
int func(int a,int b=2)
而 int func(int b=2,int a)则是不对的
(2)除函数形参外,其他引用定义时必须赋初始值
类型 & 变量名:定义一个该类型的引用
& 变量:对变量取地址,得到一个指针
(3)函数重载目的
方便调用方编写代码,提高可读性。
(4)函数体语句较多时不适合声明为内联函数
用函数体语句多少来衡量函数功能的简单与复杂,一般是将功能简单的函数声明为内联函数