Где должны быть указаны параметры по умолчанию? - PullRequest
1 голос
/ 12 октября 2010

На моем рабочем месте обычно в объявлении указываются параметры по умолчанию. Что такое обычай? Должен ли я указать параметры по умолчанию в объявлении или определении метода?

РЕДАКТИРОВАТЬ: Есть ли способ указать параметры по умолчанию для ссылок?

РЕДАКТИРОВАТЬ: Может ли кто-нибудь предоставить пример аргументов по умолчанию для ссылочных параметров?

Ответы [ 5 ]

7 голосов
/ 12 октября 2010

Объявление метода.Вызывающий абонент, вероятно, не имеет определения, но параметры по умолчанию должны быть известны в месте вызова.

2 голосов
/ 12 октября 2010

ybungalobill уже ответил на вопрос о том, где.

Что касается ссылок, для ссылки на const T вы можете просто указать значение по умолчанию напрямую.

Для ссылки на не-const вам необходимо указать "значение" по умолчанию в качестве ссылки на не-const.Это может быть глобальный или экземпляр класса с подходящим преобразованием.Например,

#include <iostream>

struct DummyInt
{
    int dummy;
    operator int& () { return dummy; }
    DummyInt(): dummy( 0 ) {}
};

void foo( int& v = DummyInt() ) {}  // Whatever

int main()
{
    int x   = 42;
    foo( x );
    foo();
}

Приветствия и hth.,

- Alf

1 голос
/ 12 октября 2010

Ну, обычной практикой является использование одинакового набора аргументов по умолчанию для всех единиц перевода.Для этого вам, очевидно, необходимо указать аргументы по умолчанию в объявлении функции в заголовочном файле.

Что касается аргумента по умолчанию для ссылочного параметра ... конечно, это возможно.Например

extern int i;

void foo(int &r = i);
void bar(const double &r = 0);
0 голосов
/ 12 октября 2010

Должен быть при объявлении метода, чтобы вызывающий мог знать, что именно ожидает функция.
Вы можете делать трюки, как говорит Альф, но не уверены, зачем это нужно. Может быть, вы хотите взглянуть на свой дизайн функции.

0 голосов
/ 12 октября 2010

Раньше я использовал значения по умолчанию, но в то же время я передумал: я считаю, что код лучше читается, когда я пишу значения параметров явноИногда я определяю другой метод, например, следующий:

bool Initialize( const char * pszPath );
bool InitializeDefault();

вместо

bool Initialize( const char * pszOptPath = NULL );
...