Инициализация той же функции, что и public, и private в классе в C ++: как это работает? - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в 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;
    }

Итак, я хотел знать, не смущает ли тот факт, что я ввожу одну и ту же функцию дважды, компилятор?Я понимаю, что когда я объявляю функции, он сможет различать две функции (от их параметров).Но разве это хорошая практика?Я хотел бы думать нет.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Эти две функции имеют разные сигнатуры функций .

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 не 'перегружены функциями.)

Бонус: например, когда компилятор запутывается
Как указать указатель на перегруженную функцию?

0 голосов
/ 24 октября 2018

Перегруженная функция в C ++, хотя она может иметь одно и то же имя, на самом деле не одна и та же функция.Поэтому, хотя я думаю, что это странная конструкция, компилятор не должен жаловаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...