目录
1、函数的定义与声明
(1)定义
(2)声明
2、指针传参
3、引用
4、函数的引用传参
5、函数重载 overlord
(1)参数数量不同
(2)参数类型不同
6、避免overlord歧义
7、内联函数inline
8、其他总结
(1)默认参数应放在形参列表最后面,设置参数默认值时应从右向左
(2)除函数形参外,其他引用定义时必须赋初始值
(3)函数重载目的
(4)函数体语句较多时不适合声明为内联函数
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)函数体语句较多时不适合声明为内联函数
用函数体语句多少来衡量函数功能的简单与复杂,一般是将功能简单的函数声明为内联函数