Проблема с аргументами по умолчанию - PullRequest
1 голос
/ 27 марта 2011

В книге C ++ Primer Стенли Б. Липпмана *, * Жозе Ладжой

в главе 14.2 Конструкторов классов говорится:

Если мытакже обеспечить поддержку для определения начального баланса, но без имени клиента?Как это происходит, спецификация класса это явно запрещает.Наш двухпараметрический конструктор со вторым аргументом по умолчанию предоставляет полный интерфейс для принятия начальных значений для членов данных класса Account, которые могут быть установлены пользователем :

class Account {
public:
       // default constructor ...
       Account();

       // parameter names are not necessary in declaration
       Account( const char*, double=0.0 ); 

       const char* name() { return _name; } // What is this for??
       // ...
private:
       // ...
};

Следующееоба являются допустимыми определениями объектов класса Account, передающими один или два аргумента нашему конструктору:

int main()
{
        // ok: both invoke two-parameter constructor
        Account acct( "Ethan Stern" ); 

Как это вызывает двухпараметрический конструктор, если он не был объявлен с одним аргументом ??

        Account *pact = new Account( "Michael Lieberman", 5000 );

А как в приведенной выше строке вызывается конструктор с аргументами по умолчанию

        if ( strcmp( acct.name(), pact->name() ))
             // ...
}

В книге, кажется, совершенно неясной с неполными кодами.Нужно хорошее объяснение конструкторов.Пожалуйста, уточните.

1 Ответ

8 голосов
/ 27 марта 2011

Дело не в конструкторах, а в аргументах по умолчанию.

void f(int x, int y = 5)
{
   //blah
}

когда вы вызываете его, предоставляя меньше аргументов, он использует значения аргументов по умолчанию. Э.Г.

f(3); //equivalent to f(3, 5);

Если один из параметров функции имеет значение по умолчанию, то все последующие параметры также должны иметь его.

void f(int x, int y = 3, int z = 4)
{
    //blah
}

f(0);    // f(0, 3, 4)
f(1, 2); //f(1, 2, 4)
f(10, 30, 20); //explicitly specifying arguments

НТН

...