繁体   English   中英

在C ++中的类中初始化与public和private相同的功能:它是如何工作的?

[英]Initialising the same function as both public and private within a class in C++: How does that work?

我是C ++的新手,正在学习金融应用程序。 在我正在阅读的书(金融数学C ++)中,有一个部分在同一类中将相同的函数初始化为公共函数和私有函数:

class BlackScholesModel {
    public: ...other members of BlackScholesModel...
    std::vector<double> generateRiskNeutralPricePath( 
    double toDate,
    int nSteps)const;
    }; 

现在,它引入了函数generateRiskNeutralPricePath作为私有函数(带有附加的shift参数):

class BlackScholesModel {
    ...other members of BlackScholesModel...
    std::vector<double> generateRiskNeutralPricePath(
    double toDate,
    int nSteps,
    double drift) const;
    }

因此,我想知道,我两次介绍相同的函数是否会混淆编译器? 我知道当我声明这些函数时,它将能够区分这两个函数(根据它们的参数)。 但是,这甚至是个好习惯吗? 我不想。

虽然C ++中的一个重载函数可能具有相同的名称,但实际上它们并不相同。 因此,尽管我认为这是一个奇怪的构造,但编译器不应抱怨。

这两个功能具有不同的功能签名

std::vector<double> generateRiskNeutralPricePath(double toDate, int nSteps);
std::vector<double> generateRiskNeutralPricePath(double toDate, int nSteps, double drift);

C ++会将它们视为两个不同的函数。 它们既可以是公共的,也可以是私有的,编译器仍将接受它。 你可以这样对待

std::vector<double> generateRiskNeutralPricePath(double toDate, int nSteps);
std::vector<double> generateRiskNeutralPricePathWithDrift(double toDate, int nSteps, double drift);

这是好习惯吗? 如果操作正确,则可以。 重载的功能通常具有几乎相同的功能。 在这种情况下,附加的drift可能只是稍微调整了返回值,而总体功能是相同的。

一个常见的例子是平方根函数。

     double sqrt (double x);
      float sqrt (float x);
long double sqrt (long double x);
     double sqrt (T x);           // additional overloads for integral types

对于允许和禁止的使用特定的重载规则,正是为了防止编译器混淆。 在这种情况下,这些函数具有不同数量的参数,因此它们的函数签名也不同。

(对于那些从C转向的人,请注意,这是C和C ++之间的关键区别之一,因为C没有函数重载。)

奖励:举个例子,说明编译器何时确实感到困惑
如何指定指向重载函数的指针?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM