C++函数与参数

传值参数:(值传递)

#include<iostream>
using namespace std;
int  func(int x, int y)
{
	return x + y;
}
int main()
{
	int a, b, sum;
	cin >> a >> b;
	sum = func(a, b);
	cout << sum << endl;
	return 0;
}

程序中:a,b为实参;x,y为形参;当运行func函数的时候将函数的实参复制给形参(传值参数);复制过程由形参类型的复制构造函数来实现;实参和形参类型不同的时候进行类型转换(自动类型转换非前置类型转换);函数调用不会修改与形参对应的实参的值;

模板函数:

模板函数实现一段通用函数,实现不同形参类型的功能

#include<iostream>
using namespace std;

template<class T>
T func(T x, T y)
{
	return x + y;
}
int main()
{
	int a, b, sum;
	float a1, b1, sum1;
	cin >> a >> b;
	sum = func(a, b);
	cout << sum << endl;
	cin >> a1 >> b1;
	sum1 = func(a1, b1);
	cout << sum1 << endl;
	return 0;
}

引用函数:

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样

引用的声明方法:类型标识符 &引用名=目标变量名;

(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。ra=1; 等价于 a=1;

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

#include<iostream>
using namespace std;

int func(int &x, int &y)
{
	return x + y;
}
int main(void)
{
	int a, b, sum;
	cin >> a >> b;
	sum = func(a, b);
	cout << sum << endl;
	return 0;
}

在传值参数中,传值的时候实参需要将实参的值复制给形参,函数结束的时候会调用析构函数进行释放,使用形参会增加程序的运行时间;而在引用参数中,函数没有复制实参的值,也没有调用析构函数;调用函数中可以改变实参的值(可以利用关键字const指明函数不可修改的引用参数[常量引用参数])。

#include<iostream>
using namespace std;

int func(int &x, int &y)
{
	x = 4;
	return x + y;
}
int main()
{
	int a, b, sum;
	cin >> a >> b;
	sum = func(a, b);
	cout << a << b << endl;
	cout << sum << endl;
	return 0;
}

(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

#include<iostream>
using namespace std;
template<class T>
T func(T &x, T &y)
{
	return x + y;
}
int main()
{
	int a, b, sum;
	float a1, b1, sum1;
	cin >> a >> b;
	sum = func(a, b);
	cout << sum << endl;
	cin >> a1 >> b1;
	sum1 = func(a1, b1);
	cout << sum1 << endl;
	return 0;
}

返回值:

返回值可以是一个值、一个引用、一个常量引用、一个指针

当返回值是一个值,返回的对象被复制到调用环境中,传值调用在调用返回结束后临时变量(返回的临时变量、其他临时变量、局部变量、传值参数)所占用的空间被释放,其值不在有效;

利用引用传递:给返回值类型后面增加一个后缀&,返回值常量引用赋值必须赋值给const常量

#include<iostream>
using namespace std;

int& func(int &x, int &y ,int &z)
{
	z = x + y;
	return z;
}
int main()
{
	int a, b, sum;
	cin >> a >> b;
	sum = func(a, b,sum);
	cout << "sum =" << sum << endl;
	return 0;
}

重载函数:

C++一个函数的签名是由这个函数的函数名、形参类型以及形参的个数确定的

C++函数重载就是定义多个同名函数,但是函数签名不同

函数调用时语句中的签名与函数定义的签名进行匹配

C语言不能进行重载是因为函数签名机制与C++不同,只有函数名决定

              

猜你喜欢

转载自blog.csdn.net/qq_20599225/article/details/83063992