Конструктор вызывается с меньшим количеством аргументов в C ++ - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть класс Foo с указанным конструктором:

class Foo {
 public:
   Foo(int w, char x, int y, int z);
   ...
 };

int main()
{
   Foo abc (10, 'a');
}

Могу ли я использовать этот конструктор вот так? Когда подпись конструктора не совпадает?

Итак, как мне дать значение по умолчанию?

Ответы [ 5 ]

5 голосов
/ 20 декабря 2011

Нет, если параметры в конце подписи не имеют значений по умолчанию, например:

class Foo {
public:
    Foo(int w, char x, int y=5, int z=0);
    ...
};

Если есть значения по умолчанию, то вы можете указать только не стандартные параметры и, по желанию, некоторые стандартные параметры,т.е. любой из следующих вызовов будет действительным:

Foo abc (10, 'a');
Foo abc (10, 'a', 3);
Foo abc (10, 'a', 42, 11);
2 голосов
/ 20 декабря 2011

Вы не можете, если отсутствующие аргументы конструктора имеют значения по умолчанию.

Например, вы можете сделать это:

class Foo {
 public:
   Foo(int w, char x, int y = 0, int z = 1);
   ...
 };

int main()
{
   Foo abc (10, 'a'); /* y is implicitly 0 and z is 1 */
}
1 голос
/ 20 декабря 2011

Чтобы предоставить параметры по умолчанию, приравните их к нулю или в противном случае к некоторому значению по умолчанию.

class Foo {
 public:
   Foo(int w, char x, int y = 0, int z = 0) { }
   // ...
 };

Или,

class Foo {
 public:
   Foo(int w, char x, int = 0, int = 0);
   // ...
 };

// Define your constructor here, note 'no default parameters'
Foo::Foo(int w, char x, int y, int z) { }
0 голосов
/ 20 декабря 2011

Я бы предложил перегрузить конструктор вместо предоставления значений по умолчанию.

class Foo {
public:
    Foo(int w, char x); // y = 0, z = 1
    Foo(int w, char x, int y); // z = 1
    Foo(int w, char x, int y, int z);
};

В конце концов, это вопрос стиля: минусы: вам нужно продублировать список инициализаторов, потому что конструкторы не могут быть объединены в цепочку, ИМХО для удобства чтения. Обязательно прочитайте эту тему .

0 голосов
/ 20 декабря 2011

Нет - если нет конструктора, который принимает два аргумента с совпадающими типами, вы не можете.

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