首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类的构造函数与函数调用操作符()重载之间的C++模糊

类的构造函数与函数调用操作符()重载之间的C++模糊
EN

Stack Overflow用户
提问于 2019-11-20 10:16:37
回答 2查看 492关注 0票数 1

我能够区分类的构造函数和函数调用操作符()重载。然而,它仍然是相当混乱的用户。所以,我只想得到一些意见,也许从设计的角度来看,写这些代码的好方法是什么。使用以下简单示例计算看涨选项的收益:

代码语言:javascript
复制
class payoff {
public:
    int strike;
    payoff (int k): strike(k) {}       // constructor which populates the data member strike. 

    int operator()(int s) { return (s > strike) ? s - strike : 0; }     // () overload
};

int main (){
    payoff x(5);
    cout << x(4) << endl;    // output: 2

return 0;
}

当我执行payoff x(5)时,我将启动一个类型为payoff的变量x,并将5传递到构造函数中。但是,当我执行x(4)时,我将4作为函数参数传递,以进行一些计算以获得回报值。看到这里的歧义了吗?使用()似乎不是很直观。

所以我刚刚开始学习c++中的函数对象/函子,我想知道这是否是设计这样一个函子的正确方法?谢谢你的回答!

编辑:只需在这个函子上添加一些注释,因为一个看涨选项将有一个固定的“罢工”,这就是为什么我认为让它成为类的数据成员是合适的。然而,期权的收益可能会有所不同,这取决于股票价格的价值。因此,在主程序中,我可以计算不同股票价格变动的不同收益水平。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-20 10:36:53

所以我刚刚开始学习c++中的函数对象/函子,我想知道这是否是设计这样一个函子的正确方法?

我不知道它是否是方式,但它是正确的和常用的。

看到这里的歧义了吗?

不是的!我是说,我明白你的意思,但不,我不认为这是一种“模糊”。稍微绕道:要小心使用“歧义”这个词,因为它在C++ (和其他语言)中有着非常明确和具体的含义,这不是您的意思。不管怎么说,用这个词和你的意思,不,我没有看到“歧义”。任何半正派的C++程序员在理解您编写的代码时都不会有任何问题。

更好的方法可能是使用带括号的列表(出于其他原因更好):

代码语言:javascript
复制
payoff x{5};
cout << x(4) << endl;

一个更简单的解决方案是使用lambda:

代码语言:javascript
复制
auto make_payoff_fun(int strike)
{
    return [strike](int s) { return  (s > strike) ? s - strike : 0; };
}


int main (){
    auto x = make_payoff_func(5);
    cout << x(4) << endl;

    return 0;
}

不管怎样,回到你的模棱两可。你得看看上下文。是的,两者都是x(5),但其中一个实际上是payoff x(5),考虑到payoff是一种类型,它显然是一个声明。

C++有一个上下文敏感文法,这意味着它有一些结构,除非您查看上下文,也就是在构造之外的代码,否则您无法知道它们是什么。这种语言充满了这些内容,是不可避免的:

代码语言:javascript
复制
int *x = &a;
*x = 24;

我们有两个*x。一个是声明的一部分,*是声明指针,另一个是表达式,*是间接操作符。

代码语言:javascript
复制
(foo)(x);

以上的表达是什么?这取决于什么是foox。它可以是:

  • 使用对象foo作为参数调用函数x
  • 转换为对象foo的类型x
  • 创建一个类型为foo的临时对象,使用x初始化。
  • 以对象operator()作为参数对对象foox进行调用。
  • 调用转换运算符(decltype(x))::operator foo()

我肯定我错过了一些。

你知道还有什么是上下文敏感的语法吗?人类语言。下面是一些我匆忙地在网上找到的的例子

词汇歧义: “我去了银行。”(银行可能是存放金钱的地方,也可能是河流的边缘。) “我把账单寄给约翰了。”(账单可以是约翰欠下的钱,也可以是盖帽的账单,这样修理帽子的约翰就可以修理帽子了。) 句法(语法)歧义: “探亲会让人精疲力竭。”(什么是令人筋疲力尽的:当亲戚来看你时,还是当你去探亲时?) “我们别再控制别人了”(这是否意味着“让我们阻止控制他人的人”,还是“让我们停止控制他人?”)

票数 3
EN

Stack Overflow用户

发布于 2019-11-20 10:27:05

首先,将explicit关键字添加到构造函数中。

然后,如果希望使构造函数更加显式,可以将其设置为私有,然后添加一个公共静态方法create(),该方法返回该类的一个实例。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58951859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档