在 C++ 中的类中初始化与公共和私有相同的函数:它是如何工作的?

Posted

技术标签:

【中文标题】在 C++ 中的类中初始化与公共和私有相同的函数:它是如何工作的?【英文标题】:Initialising the same function as both public and private within a class in C++: How does that work? 【发布时间】:2018-10-24 18:57:16 【问题描述】:

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

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

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

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

所以,我想知道,我两次引入同一个函数这一事实不会让编译器感到困惑吗?我知道当我声明函数时,它将能够区分这两个函数(从它们的参数)。但是,这甚至是一个好习惯吗?我想不会。

【问题讨论】:

我建议你先get a few generic C++ books阅读,然后学习语言。如果您随后分别阅读金融和数学知识,您就可以集中知识。 如果参数不同,你有两个不同的功能。 注意参数的数量或它们的类型必须不同。名称不够好 void X(int a, int b)void X(int c, int d) 在编译器看来是一样的。 这里的关键词是“函数重载”。这是两个不同的函数,尽管它们具有相同的名称。 好书与坏书有很大的不同。我很高兴它有帮助。祝你好运! :) 【参考方案1】:

C++ 中的重载函数虽然可能具有相同的名称,但实际上并不是同一个函数。所以虽然我认为这是一个奇怪的结构,但编译器不应该抱怨。

【讨论】:

C 没有函数重载,也没有“C/C++”这样的语言。【参考方案2】:

这两个函数有不同的函数签名

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 没有函数重载。)

奖励:举例说明编译器何时会感到困惑How do I specify a pointer to an overloaded function?

【讨论】:

以上是关于在 C++ 中的类中初始化与公共和私有相同的函数:它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 与类中的成员相同的类

如何使用 gmock 模拟修改 C++ 类中的私有变量的成员函数?

需要相同递归函数的私有和公共方法

C++ 友元

从 C++ 中的类访问私有变量

ZeroC ICE源代码中的那些事 - 嵌套类和局部类