参数传递
- 在函数被调用时才分配形参的存储单元
- 实参可以是变量、常量或表达式
- 实参类型必须与形参相符(不相符时会做强制类型转换)
- 值传递是传递参数值,即是单向传递
- 引用传递可以实现双向传递
- 常引用作参数可以保障实参数据的安全
引用类型
- 引用(&)是标识符的别名
int i,j;
int &ri = i;//定义Int引用ri,并初始化为变量i的引用
引用(&)是标识符的别名,定义一个引用时,必须同时对他进行初始化,使它指向一个已存在的对象
int i,j;
int &ri = i;//定义int引用ri,并初始化为变量i的引用
初始化之后两个名字指向同一个变量
int i,j;
int &ri = i;
j = 10;
ri = j;//相当于i = j
引用可以作为形参进行双向传递
- 值传递
#include <iostream>
using namespace std;
void swap(int a, int b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int x = 5, y = 10;
cout << "x= " << x << "y= " << y << endl;
swap(x, y);
cout << "x= " << x << "y= " << y << endl;
return 0;
}
//执行主函数中的函数调用swap(x,y)时我们是用实参初始化形参只进行了对a,b的赋值
//双向传递利用引用
//a,b本身就不是变量是对x,y的引用
#include <iostream>
using namespace std;
void swap(int& a, int& b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int x = 5, y = 10;
cout << "x= " << x << " "<< "y= " << y << endl;
swap(x, y);
cout << "x= " << x << " "<< "y= " << y << endl;
return 0;
}
可变长度的形参表
- 如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型
- 如果实参的类型不同,我们可以编写可变参数的摸办
- initializer_list是一种标准库类型,用于表示某种特定类型的值得数组该类型定义在同名的头文件中
- initializer_list比较特殊的一点是:某对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值
- 含有initializer_list形参的函数也可以同时拥有其他形参
- 使用initializer_list编写一个错误信息输出函数,使其可以作用于可变数量的形参
initializer_list<string> is
initializer_list<int >
内联函数
- 内联函数声明时要用到关键字inline
- 不需要转到子函数,节省了参数传递
- 内联函数体内不能有循环语句和switch语句
- 内联函数的定义必须出现在内联函数第一次被调用之前
- 对内联函数不能进行异常接口声明
#include <iostream>
using namespace std;
const double PI = 3.14159265358979;
inline double carArea(double radius) {
return PI * radius * radius;
}
int main()
{
double r = 3.0;
double area = carArea(r);
cout << area << endl;
return 0;
}
constexpr函数
- 常量表达式用来初始化常量,只要参数是常量表达式返回值也是常量表达式
constexper int get_size(){return 20;}
coustexper int foo = get_size();
带默认参数值的函数
- 在定义函数的时候可以给形参确定默认的值如果调用时赋给实参,就用实参的值,如果不给,就用默认的形参的值。
- 有默认参数的形参必须列在形参表的最后,即默认参数值的右边不能有无默认值的参数
- 调用时实参与形参的结合次序时从左向右
- 函数的调用和形参的位置关系,调用在前应先声明
int add(int x = 5,int y = 6){
return x + y;
}
int main(){
add(10,20)//10+20
add(10);//10+6
add();//5+6
}
函数重载
- C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载
- 参数的类型不同或形参个数不同
- 编译器不以形参名来区别,也不以返回值来区分,不将不同功能的函数声明为重载函数
int add(int x,int y);
float add(float x,float y);
#include <iostream>
using namespace std;
int sum(int a, int b)
{
return a * a + b * b;
}
double sum(double a,double b)
{
return a * a + b * b;
}
int main()
{
cout << "请输入两个整数" << endl;
int m, n;
double x, y;
cin >> m >> n;
cout << "两个整数的平方和是" << sum(m, n) << endl;
cout << "请输入两个小数" << endl;
cin >> x >> y;
cout << "两个小数的平方和是" << sum(x, y) << endl;
return 0;
}
C++系统函数
练习
温度的转换
#include <iostream>
using namespace std;
float Convert(float TempFer)
{
float C = (TempFer - 32) * 5 / 9;
return C;
}
int main()
{
cout << "请输入一个摄氏温度" << endl;
float F;
cin >> F;
float C = Convert(F);
cout << "转化后的温度是:" << C << endl;
return 0;
}
函数的调用在函数的定义之前需要进行函数原型的声明
练习:费波纳基数列
#include <iostream>
using namespace std;
int fib(int n)
{
int m;
if (n <= 2)
return 1;
else
m = fib(n - 1) + fib(n - 2);
return m;
}
int main()
{
cout << "请输入一个整数" << endl;
int n;
cin >> n;
cout << "结果为" << " " << fib(n) << endl;
return 0;
}