C++
c语音基础下的c++学习
函数调用的用法
C++中函数调用的方法与C语言并无区别,依旧是在调用方函数中执行函数调用语句来实现函数调用,
带默认形参值的函数
在C++中,允许在自定义函数的形参列表中,给形参一个默认的值,这样在调用的时候如果有实参,那么按照实参传递给形参的方法使用;若调用的时候没有指定对应的实参,则形参将使用默认值。
例如一个 求加法的函数,代码如下:
#include<iostream>
using namespace std;
int add(int a=3,int b=5)
{
return a+b;
}
int main()
{
cout<<add(10,20)<<endl;//将10和20分别给a和b
cout<<add(30)<<endl;//将30给a,b为默认的5
cout<<add()<<endl;//使用a、b的默认值3和5
return 0;
}
需要注意的是,由于参数的传递顺序是从右至左入栈,所以有默认值的参数必须在放在形参列表的最右边!
另外,当函数需要提前声明时,若形参存在默认参数,则声明部分可以制定默认值,而后面的函数定义部分则不再制定默认值
C++函数重载
在实际的代码编写当中,有时候对于同一个功能函数,可能处理的对象类型不同,则需要重新实现一遍这个函数,这样下去就显得代码更加繁多,C++为了解决这一问题,而支持函数重载来解决这个问题。
比如一个算术求和的问题,需要自定义一个函数,用来接收传入数据的并求和,但作为独立的一个模块,如何知道调用方,传入什么类型的数据呢,可能是整型数据,当然也可能是浮点类型的数据,还可能是一个整数一个浮点型(还不知道哪一个是整型,哪一个是浮点型),而周全的做法是各种类型的形参的函数都要定义一个,即:两个int类型的,两个double类型的,第一个int第二个double的,及第一个double第二个int的类型的,定义四个函数来实现:比如名字叫:Add_double_double()、Add_int_double()、Add_int_int()、Add_double_int()等等
#include<iostream>
using namespace std;
int add(int a,int b)
{
cout<<"(int ,int)\t";
return a+b;
}
double add(double a,double b)
{
cout<<"(doble ,double)\t";
return a+b;
}
double add(double a,int b)
{
cout<<"(double ,int)\t";
return a+b;
}
double add(int a,double b)
{
cout<<"(int ,double)\t";
return a+b;
}
int main()
{
cout<<add(2,3)<<endl;
cout<<add(2.9,15.3)<<endl;
cout<<add(10,9.9)<<endl;
cout<<add(11.5,5)<<endl;
return 0;
}
函数模板
函数模板,是可以创建一个通用的函数,可以支持多种形参。
用关键字template来定义,形式如下:
template<class 类型名1,class 类型名2…>
返回值 函数名(形参表列) 模板参数表
{
函数体
}
第一行的template<class 类型名1,class 类型名2…>是一句声明语句 ,template是定义模板函数的关键字,尖括号里可以有多个类型,前面都要用class(或者typename来定义)。然后后面跟定义的函数模板,切记中间不可以加其他的语句,不然会报错!
#include<iostream>
using namespace std;
template<class T1,class T2>
T1 add(T1 x,T2 y)
{
cout<<sizeof(T1)<<","<<sizeof(T2)<<"\t";
return x+y;
}
int main()
{
cout<<add(10,20)<<endl;;
cout<<add(3.14,5.98)<<endl;
cout<<add('A',2)<<endl;
return 0;
}