鱼C论坛

 找回密码
 立即注册
查看: 1967|回复: 0

[技术交流] C++(7th):函数重载,数组,字符串

[复制链接]
发表于 2021-2-4 20:46:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一叶枫残 于 2021-2-8 18:04 编辑

函数重载

简单的说,函数重载就是可以定义多个函数名相同的函数,但前提是它们实现的函数功能一致,不同在于传递的参数类型不同或者数量不同;
也就说,重载的意义在于方便对不同的数据类型进行处理

课后作业1:为什么不能通过返回值的不同来重载函数(方法)?
我的回答:
看如下代码
  1. #include <iostream>

  2. using namespace std;

  3. float add(float i, float j , float k);
  4. int add(float i, float j, float k);


  5. int main()
  6. {
  7.         float i,j,k;
  8.         cout << add(i,j,k) << endl;
  9.        
  10.         return 0;
  11. }


  12. float add(float i, float j , float k)
  13. {
  14.         float sum;
  15.         sum = i + j + k;
  16.        
  17.         return sum;
  18. }

  19. int add(float i, float j, float k)
  20. {
  21.         int sum;
  22.         sum = i + j + k;
  23.                
  24.         return sum;
  25. }
复制代码

编译的时候,编译器会报错,程序实现不了
原因很简单,定义重载函数,在传入参数相同的情况下,使用add函数,程序不知道该使用哪个返回值的函数,从而导致错误,假如,就算可以编译成功可以运行,当你写add函数你怎么知道程序会如你所愿返回你想要的类型的返回值,所以不能通过返回值的不同来重载函数;

课后作业2:利用重载函数的方法设计一个程序,该程序通过函数"calc()"进行计算并返回显示结果。
——当传入一个参数时,计算该参数的平方值;
——当传入两个参数时,计算两个参数的积;
——当传入三个参数时,计算三个参数的和;

上代码
  1. #include <iostream>

  2. using namespace std;

  3. int calc(int a);
  4. int calc(int a , int b);
  5. int calc(int a, int b, int c);

  6. int main()
  7. {
  8.         int a , b , c;
  9.         cout << "请输入a,b,c三个参数值:" << endl;
  10.         cin >> a;
  11.         cin >> b;
  12.         cin >> c;
  13.        
  14.         cout << "传入一个参数a,对应的calc的输出:" << calc( a ) << endl;
  15.         cout << "传入两个个参数a,b,对应的calc的输出:" << calc( a , b) << endl;
  16.         cout << "传入三个参数a,b,c,对应的calc的输出:" << calc( a , b , c) << endl;
  17.        
  18.         return 0;
  19. }

  20. int calc(int a)
  21. {
  22.         return a*a;
  23. }

  24. int calc(int a , int b)
  25. {
  26.         return a*b;
  27. }

  28. int calc(int a, int b, int c)
  29. {
  30.         return a + b + c;
  31. }
复制代码

程序简单,就不解说了;

复杂的数据类型

数组

编程任务:定义一个数组容纳10个整数,这些整数来自用户输入。我们将计算这些值的累加和、平均值并输出;
  1. #include <iostream>

  2. using namespace std;

  3. int addArray( int *array , int size);
  4. float array_average( int* array , int size);


  5. int main()
  6. {
  7.         int array[10];
  8.         int size;
  9.         size = sizeof(array) / sizeof(array[0]);
  10.        
  11.         for(int i = 0; i < 10 ; i++)
  12.         {
  13.                 cout << "请输入第" << i+1 << "个整数:" << endl;
  14.                 cin >> array[i];
  15.         }
  16.        
  17.         cout << "整数和为:" << addArray( array ,size) << endl;
  18.         cout << "平均值为:" << array_average( array , size) << endl;
  19.        
  20.         return 0;
  21. }

  22. int addArray( int *array , int size)
  23. {
  24.         int sum = 0;
  25.         int i;
  26.       
  27.         for( i = 0; i < size; i++ )
  28.         {
  29.                 sum+=*array++;
  30.         }
  31.       
  32.         return sum;
  33. }
  34. float array_average( int* array , int size)
  35. {
  36.         float aver;
  37.         aver = (float)addArray( array , size ) / size;
  38.         cout << aver;
  39.         return aver;
  40. }
复制代码

程序简答,不解说;
注意的是:在函数addArray内的sum是一个局部变量,存放在栈里面,它的初始值如果不进行初始化会是千变万化的,所以一定要进行初始化;

如果我们是要输入15个数据而不是10个数据该怎么办呢?(程序的通用性)
我们可以使用define
程序就变为
  1. #include <iostream>

  2. using namespace std;

  3. int addArray( int *array , int size);
  4. float array_average( int* array , int size);

  5. #define NUM 15

  6. int main()
  7. {
  8.         int array[NUM];
  9.         int size;
  10.         size = sizeof(array) / sizeof(array[0]);
  11.        
  12.        
  13.         for(int i = 0; i < NUM ; i++)
  14.         {
  15.                 cout << "请输入第" << i+1 << "个整数:" << endl;
  16.                 cin >> array[i];
  17.         }
  18.        
  19.         cout << "整数和为:" << addArray( array ,size) << endl;
  20.         cout << "平均值为:" << array_average( array , size) << endl;
  21.        
  22.         return 0;
  23. }

  24. int addArray( int *array , int size)
  25. {
  26.         int sum = 0;
  27.         int i;
  28.       
  29.         for( i = 0; i < size; i++ )
  30.         {
  31.                 sum+=*array++;
  32.         }
  33.       
  34.         return sum;
  35. }
  36. float array_average( int* array , int size)
  37. {
  38.         float aver;
  39.         aver = (float)addArray( array , size ) / size;
  40.         cout << aver;
  41.         return aver;
  42. }
复制代码

通用性
当你需要不同的输入规模需求时,只要改变宏定义NUM的值即可,不用对整个程序进行从头到尾的修改,所以宏定义是一个好东西,在做大型程序时,一定要使用宏定义来使得后期维护变得简单;
宏定义要注意,定义时后面不能带上分号; ,否则程序会出错;

与宏定义相同的是,定义静态变量,有着相同的作用,定义方法:
  1. const unsigned short NUM = 15
复制代码

但要注意定义的范围是局部时还是全局
安全性
但如果用户输入值错误怎么办;
从我之前的笔记记录可知,当输入不是数字时,程序会因为缓冲区存在非数字值使得后面的cin都无效,这时候后面不用输入就跳到输出和与平均值的步骤了
这个涉及到程序的安全性,这个时候我们要对程序修改,使得输入非法数值时要让程序输出提醒并保证后面输入正常

在前面笔记有这样一行代码
  1. while(cin >> in)
复制代码

我们可以使用这个来保证输入
于是我们把for循环改为
  1. for(int i = 0; i < NUM ; i++)
  2. {
  3.         cout << "请输入第" << i+1 << "个整数:" << endl;
  4.         while( !(cin >> array[i]) )
  5.         {
  6.                 cout << "输入错误,请重新输入第" << i+1 << "个整数" << endl;
  7.                 cin.clear();
  8.                 cin.ignore( 100 , '\n');
  9.         }
  10. }
复制代码

这里要注意,为什么要用cin.clear()和cin.ignore( 100 , '\n') , 我在之前的笔记提到过,当输入错误时,这个错误字符还是留在输入缓冲区的,需要清除这个错误字符以及回车字符
还需要注意的是,cin.ignore()后面不需要再写一个cin >> array[i],因为返回while循环时还会再执行一次条件!(cin >> array[i])
这样程序的安全性就得到了保证了

字符串

在C语言中,我们常用char来定义字符串,但在C++中我们可以用string来定义字符串,需要包含头文件string
  1. #include <iostream>
  2. #include <string>

  3. using namespace std;

  4. int main()
  5. {
  6.         string st;
  7.         cout << "请输入一串字符串:";
  8.         getline( cin , st );
  9.         cout << st;
  10.        
  11.         return 0;
  12. }
复制代码

注意,这里使用的是getline,而不是cin.getline(),第一个参数写cin,第二个就是字符串,在getline里面的字符串类型是string,在cin.getline()里面的字符串类型是char,所以string不能用在cin.getline里面;
还有的是,如果要储存字符串就不能使用cin >> st ,原因是cin会以空格和回车为结束的标志,当你的字符串有空格时,程序会把它当为结束的标志,于是空格后面的字符就没有储存到st里面;
在下一次的笔记会详细结束string各类对象函数。

评分

参与人数 1鱼币 +2 收起 理由
心驰神往 + 2 无条件支持楼主!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-2 04:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表