c++重载函数调用运算符

函数调用运算符

如果类重载了函数调用运算符则我们可以像使用函数一样使用该类的对象。

函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符。

struct absint {

int operator()(int val)

{

return val < 0 ? -val : val;

}

};

int x = -7;

absint absobj;//含有函数调用运算符的对象

int xu = absobj(x);

cout << xu << endl;

 

 

可调用对象

调用形式:调用形式指明了调用返回的类型以及传递给调用的实参类型。

一种调用形式对应一个函数类型。

int(int, int)//一个函数类型,接受两个int,返回一个int

 

不同类型可能具有相同的调用形式

以下都共享了一种调用形式int(int,int)

int add(int a, int b){return a+b;}//普通函数

auto mod = [](int a, int b){return a%b;}//lambda表达式

struct divide {

int operator()(int a, int b) { return a / b; }

};//函数对象类

 

function类型

function类型可以用来存储可调用对象的指针,定义在头文件functional中

function<T> f:f是一个用来存储可调用对象的空function

result_type:该function类型的可调用对象的返回类型

argument_type:当T有一个或两个实参时定义的类型。如果T只有一个实参,则argument_type是该类型的同义词,如果T有两个实参,则first_argument_type和second_argument_type分别代表两个实参的类型。

不能将重载函数的名字存入function类型对象中,可以使用函数指针或lambda

function<int(int, int)> f;

f = divide();

cout << f(8, 2) << endl;

 

function<int(int, int)>f2;

f2 = [](int a, int b) {return a%b; };

cout << f2(17, 10) << endl;

 

function类型可以存放在容器中

map<string, function<int(int, int)>> binpos = {

{"%",divide() },

{"+",[](int a, int b) {return a+b; } },

};

cout << binpos["+"](4, 5) << endl;

cout << binpos["%"](18, 10) << endl;

 

为了解决二义性,不要直接将函数的名字存入function中,最好是存储函数指针,或存入lambda表达式

int(*fp)(int, int) = add;//add为一个函数名

binpos.insert({ "+",fp });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值