鱼C论坛

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

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

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

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

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

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都无效,这时候后面不用输入就跳到输出和与平均值的步骤了
这个涉及到程序的安全性,这个时候我们要对程序修改,使得输入非法数值时要让程序输出提醒并保证后面输入正常

在前面笔记有这样一行代码
while(cin >> in)
我们可以使用这个来保证输入
于是我们把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各类对象函数。

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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