C++函数调用操作符重载
与下标操作符重载函数相同,我们同样需要以类成员函数的形式对函数调用操作符
有了这两个函数调用操作符重载函数,我们就可以用 A(i,j) 的形式访问二维数组中的数据了。当我们用 A(i,j) 的形式访问二维数组中的数据时,A(i,j) 会调用类中的函数调用操作符重载函数,此时 A(i,j) 可以理解为:
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
( )进行重载。其声明语法只有一种形式:
返回类型 operator()(参数列表);
举个例子:
#include<iostream>
#include<string>
using namespace std;
class Array
{
public:
Array(){len1 = 0; len2 = 0; num = NULL; };
Array(int m, int n);
int & operator()(int, int);
const int & operator()(int, int)const;
int getlen1()const {return len1;}
int getlen2()const {return len2;}
private:
int len1;
int len2;
int * num;
};
Array::Array(int m, int n)
{
int size = m * n;
try
{
num = new int[size];
}
catch(bad_alloc)
{
cerr<<"allocate storage failure!"<<endl;
throw;
}
len1 = m;
len2 = n;
}
int & Array::operator()(int i, int j)
{
if(i < 0 || i >= len1)
throw string("1 out of bounds!");
if(j < 0 || j >= len2)
throw string("2 out of bounds!");
return num[ i*len2 + j ];
}
const int & Array::operator()(int i, int j)const
{
if(i < 0 || i >= len1)
throw string("1 out of bounds!");
if(j < 0 || j >= len2)
throw string("2 out of bounds!");
return num[ i*len2 + j ];
}
int main()
{
Array A(3,4);
int i,j;
for(i = 0; i < A.getlen1(); i++)
for(j = 0; j < A.getlen2(); j++)
A(i,j) = i * A.getlen2() + j;
for(i = 0; i < A.getlen1(); i++)
for(j = 0; j < A.getlen2(); j++)
cout<< A(i,j)<<" ";
cout<<endl;
try
{
cout<< A(5, 3) << endl;
}
catch(string s)
{
cerr<< s <<endl;
}
try
{
cout<< A(2, 6) << endl;
}
catch(string s)
{
cerr<< s <<endl;
}
return 0;
}
在这个例子中,我们定义了一个 Array 类,这个类描述的是一个二维数组。在类中,我们先定义了一个默认构造函数,之后声明了一个带参数的构造函数Array(int m, int n);,两个参数分别表示数组的两个维度值。之后声明了两个函数调用操作符重载函数,分别是:
int & operator()(int, int); const int & operator()(int, int)const;因为只有常成员函数才能处理常对象,所以我们依然在类中提供两个版本的函数调用操作符重载函数。我们可以看一下这两个函数的函数定义,在它们的函数体中,我们先是做一个越界检测,当然对于二维数组而言,边界是有两个的,因此有两次边界检测,如果没有越界,则会返回对应的值。
有了这两个函数调用操作符重载函数,我们就可以用 A(i,j) 的形式访问二维数组中的数据了。当我们用 A(i,j) 的形式访问二维数组中的数据时,A(i,j) 会调用类中的函数调用操作符重载函数,此时 A(i,j) 可以理解为:
A.operator()(i, j)例 1 程序的运行结果如下:
0 1 2 3 4 5 6 7 8 9 10 11
1 out of bounds!
2 out of bounds!
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
ICP备案:
公安联网备案: