在 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++ 中的类中初始化与公共和私有相同的函数:它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章