马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 一叶枫残 于 2021-2-8 18:04 编辑
函数重载
简单的说,函数重载就是可以定义多个函数名相同的函数,但前提是它们实现的函数功能一致,不同在于传递的参数类型不同或者数量不同;
也就说,重载的意义在于方便对不同的数据类型进行处理
课后作业1:为什么不能通过返回值的不同来重载函数(方法)?
我的回答:
看如下代码#include <iostream>
using namespace std;
float add(float i, float j , float k);
int add(float i, float j, float k);
int main()
{
float i,j,k;
cout << add(i,j,k) << endl;
return 0;
}
float add(float i, float j , float k)
{
float sum;
sum = i + j + k;
return sum;
}
int add(float i, float j, float k)
{
int sum;
sum = i + j + k;
return sum;
}
编译的时候,编译器会报错,程序实现不了
原因很简单,定义重载函数,在传入参数相同的情况下,使用add函数,程序不知道该使用哪个返回值的函数,从而导致错误,假如,就算可以编译成功可以运行,当你写add函数你怎么知道程序会如你所愿返回你想要的类型的返回值,所以不能通过返回值的不同来重载函数;
课后作业2:利用重载函数的方法设计一个程序,该程序通过函数"calc()"进行计算并返回显示结果。
——当传入一个参数时,计算该参数的平方值;
——当传入两个参数时,计算两个参数的积;
——当传入三个参数时,计算三个参数的和;
上代码#include <iostream>
using namespace std;
int calc(int a);
int calc(int a , int b);
int calc(int a, int b, int c);
int main()
{
int a , b , c;
cout << "请输入a,b,c三个参数值:" << endl;
cin >> a;
cin >> b;
cin >> c;
cout << "传入一个参数a,对应的calc的输出:" << calc( a ) << endl;
cout << "传入两个个参数a,b,对应的calc的输出:" << calc( a , b) << endl;
cout << "传入三个参数a,b,c,对应的calc的输出:" << calc( a , b , c) << endl;
return 0;
}
int calc(int a)
{
return a*a;
}
int calc(int a , int b)
{
return a*b;
}
int calc(int a, int b, int c)
{
return a + b + c;
}
程序简单,就不解说了;
复杂的数据类型
数组
编程任务:定义一个数组容纳10个整数,这些整数来自用户输入。我们将计算这些值的累加和、平均值并输出;#include <iostream>
using namespace std;
int addArray( int *array , int size);
float array_average( int* array , int size);
int main()
{
int array[10];
int size;
size = sizeof(array) / sizeof(array[0]);
for(int i = 0; i < 10 ; i++)
{
cout << "请输入第" << i+1 << "个整数:" << endl;
cin >> array[i];
}
cout << "整数和为:" << addArray( array ,size) << endl;
cout << "平均值为:" << array_average( array , size) << endl;
return 0;
}
int addArray( int *array , int size)
{
int sum = 0;
int i;
for( i = 0; i < size; i++ )
{
sum+=*array++;
}
return sum;
}
float array_average( int* array , int size)
{
float aver;
aver = (float)addArray( array , size ) / size;
cout << aver;
return aver;
}
程序简答,不解说;
注意的是:在函数addArray内的sum是一个局部变量,存放在栈里面,它的初始值如果不进行初始化会是千变万化的,所以一定要进行初始化;
如果我们是要输入15个数据而不是10个数据该怎么办呢?(程序的通用性)
我们可以使用define
程序就变为#include <iostream>
using namespace std;
int addArray( int *array , int size);
float array_average( int* array , int size);
#define NUM 15
int main()
{
int array[NUM];
int size;
size = sizeof(array) / sizeof(array[0]);
for(int i = 0; i < NUM ; i++)
{
cout << "请输入第" << i+1 << "个整数:" << endl;
cin >> array[i];
}
cout << "整数和为:" << addArray( array ,size) << endl;
cout << "平均值为:" << array_average( array , size) << endl;
return 0;
}
int addArray( int *array , int size)
{
int sum = 0;
int i;
for( i = 0; i < size; i++ )
{
sum+=*array++;
}
return sum;
}
float array_average( int* array , int size)
{
float aver;
aver = (float)addArray( array , size ) / size;
cout << aver;
return aver;
}
通用性
当你需要不同的输入规模需求时,只要改变宏定义NUM的值即可,不用对整个程序进行从头到尾的修改,所以宏定义是一个好东西,在做大型程序时,一定要使用宏定义来使得后期维护变得简单;
宏定义要注意,定义时后面不能带上分号; ,否则程序会出错;
与宏定义相同的是,定义静态变量,有着相同的作用,定义方法:const unsigned short NUM = 15
但要注意定义的范围是局部时还是全局
安全性
但如果用户输入值错误怎么办;
从我之前的笔记记录可知,当输入不是数字时,程序会因为缓冲区存在非数字值使得后面的cin都无效,这时候后面不用输入就跳到输出和与平均值的步骤了
这个涉及到程序的安全性,这个时候我们要对程序修改,使得输入非法数值时要让程序输出提醒并保证后面输入正常
在前面笔记有这样一行代码我们可以使用这个来保证输入
于是我们把for循环改为for(int i = 0; i < NUM ; i++)
{
cout << "请输入第" << i+1 << "个整数:" << endl;
while( !(cin >> array[i]) )
{
cout << "输入错误,请重新输入第" << i+1 << "个整数" << endl;
cin.clear();
cin.ignore( 100 , '\n');
}
}
这里要注意,为什么要用cin.clear()和cin.ignore( 100 , '\n') , 我在之前的笔记提到过,当输入错误时,这个错误字符还是留在输入缓冲区的,需要清除这个错误字符以及回车字符
还需要注意的是,cin.ignore()后面不需要再写一个cin >> array[i],因为返回while循环时还会再执行一次条件!(cin >> array[i])
这样程序的安全性就得到了保证了
字符串
在C语言中,我们常用char来定义字符串,但在C++中我们可以用string来定义字符串,需要包含头文件string#include <iostream>
#include <string>
using namespace std;
int main()
{
string st;
cout << "请输入一串字符串:";
getline( cin , st );
cout << st;
return 0;
}
注意,这里使用的是getline,而不是cin.getline(),第一个参数写cin,第二个就是字符串,在getline里面的字符串类型是string,在cin.getline()里面的字符串类型是char,所以string不能用在cin.getline里面;
还有的是,如果要储存字符串就不能使用cin >> st ,原因是cin会以空格和回车为结束的标志,当你的字符串有空格时,程序会把它当为结束的标志,于是空格后面的字符就没有储存到st里面;
在下一次的笔记会详细结束string各类对象函数。 |