C++中的函数重载
在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。
下面的实例中,同名函数 print() 被用于输出不同的数据类型:
using namespace std;
class printData
{
public:
void print(int i)
{cout<<"整数为:"<<i<<endl;}
void print(double f)
{cout<<"浮点数为:"<<f<<endl;}
void print(string c)
{cout<<"字符串为"<<c<<endl;}
};
int main(void)
{
printData pd;
//输出整数
pd.print(5);
//输出浮点数
pd.print(500.263);
//输出字符串
pd.print("Hello C++");
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
整数为:5
浮点数为:500.263
字符串为:Hello C++
C++中的运算符重载
您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数。
下面的实例使用成员函数演示了运算符重载的概念。在这里,对象作为参数进行传递,对象的属性使用
this
运算符进行访问,如下所示:
using namespace std;
class Box
{
public:
double getVolume(void)
{
return length*breadth*height;
}
void setLength(double len)
{
length=len;
}
void setBreadth(double bre)
{
breadth=bre;
}
void setHeight(double hei)
{
height=hei;
}
//重载+运算符,用于把两个Box对象相加
Box operator+(const Box&b)
{
Box box;
box.length=this->length+b.length;
box.breadth=this->breadth+b.breadth;
box.height=this=>height+b.height;
return box;
}
private:
double length;
double breadth;
double height;
};
int main()
{
Box box1;
Box box2;
Box box3;
double volume=0.0;
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
Box2.setLength(12.0);
Box2.setBeadth(13.0);
Box2.setHeight(10.0);
volume=Box1.getVolume();
cout<<"Volume of Box1:"<<vome<<endl;
volume=Box2.getVolume();
cout<<"Volume of Box2:"<<vome<<endl;
Box3=Box1+Box2;
volume=Box3.getVolume();
cout<<"Volume of Box3:"<<volume<<endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Volume of Box1:210
Volume of Box2:1560
Volume of Box3:5400
C++STL教程
在前面的章节中,我们已经学习了 C++ 模板的概念。C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
C++ 标准模板库的核心包括容器,算法,迭代器三个组件。
这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。
下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:
实例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
//创建一个向量存储 int
vector<int>vec;
int i;
//显示 vec 的原始大小
cout<<"vector size="<<vec.size()<<endl;
//推入5个值到向量中
for(i=0;i<5;i++)
{
vec.push_back(i);
}
//显示vec扩展后的大小
cout<<"extended vector size="<<vec.size()<<endl;
//访问向量中的5个值
for(i=0;i<5;i++)
{
cout<<"value of vec["<<i<<"]="<<vec[i]<<endl;
}
//使用迭代器iterator访问值
vector<int>::iterator v=vec.begin();
while(v!=vec.end())
{
cout<<"value of v="<<*v<<endl;
v++;
}
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
vector size=0
extended vector size=5
value of vec[0]=0
value of vec[1]=1
value of vec[2]=2
value of vec[3]=3
value of vec[4]=4
value of v=0
value of v=1
value of v=2
value of v=3
value of v=4
关于上面实例中所使用的各种函数,有几点要注意:
1.push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。
2.size( ) 函数显示向量的大小。
3.begin( ) 函数返回一个指向向量开头的迭代器。
4.end( ) 函数返回一个指向向量末尾的迭代器。
心得体会:
第一,重载运算符的存在实现了c++某些函数功能的合并,使得程序的编写和运行更加有效率,为高级程序的简洁化提供了保障;第二,STL标准库的存在统一规范了运算符的功能性,使得c++程序的编写更趋向于程式化,优化了程序漏洞的容错性,为我们进一步学习高等编写技能提供了保证。