C++基础实验2

参数传递

  • 在函数被调用时才分配形参的存储单元
  • 实参可以是变量、常量或表达式
  • 实参类型必须与形参相符(不相符时会做强制类型转换)
  • 值传递是传递参数值,即是单向传递
  • 引用传递可以实现双向传递
  • 常引用作参数可以保障实参数据的安全

引用类型

  • 引用(&)是标识符的别名
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;
}
发布了42 篇原创文章 · 获赞 2 · 访问量 1022

猜你喜欢

转载自blog.csdn.net/soulmate______/article/details/104682417
今日推荐