Конструктор со значениями по умолчанию и различными конструкторами - PullRequest
0 голосов
/ 14 сентября 2011

Я хотел бы сделать что-то подобное

class foo{
private:
    double a,b;

public:
    foo(double a=1, double b=2){
        this.a=a;
        this.b=b;
    }
}

int main(){
    foo first(a=1);
    foo first(b=2);
}

Возможно ли это или мне нужно создать два новых конструктора?разница в этих двух конструкторах:

class foo{
private:
    int a;

public:
    foo(int in):a(in){}
}

или

class foo{
private:
    int a;

public:
    foo(int in){a=in}
}

Ответы [ 4 ]

1 голос
/ 14 сентября 2011
foo first(a=1);
foo first(b=2);

Вы не можете иметь это в C ++.Когда-то он был рассмотрен для стандартизации, но затем упал.Boost.Parameter делает все возможное для аппроксимации именованных параметров, см. http://www.boost.org/doc/libs/1_47_0/libs/parameter/doc/html/index.html

foo(int in):a(in){}
foo(int in){a=in}

Первый конструктор инициализирует a, а второй присваивает ему.Для этого конкретного случая (int) нет особой разницы.

1 голос
/ 14 сентября 2011

В C ++ указатель this является pointer, а не object (в Java вы можете получить к нему доступ с помощью .). Тем не менее, вам потребуется стрелка разыменования (т. Е. this->member или (*this).member).

В любом случае это можно сделать. Однако параметризация в C ++ работает в обратном порядке и не может быть названа. Например, int test(int a=2, int b=42) является законным, а также int test(int a, int b=42). Однако int test(int a=2, b) не является законным.

Что касается вашего второго вопроса, в этом примере нет существенной разницы между конструкторами. Существуют незначительные (потенциальные) различия в скорости, но в этом случае они, скорее всего, незначительны. В первом случае вы используете список инициализаторов (требуется для наследования и вызова конструктора базового класса, если это необходимо), а во втором просто задается значение вашей переменной (то есть с использованием operator = ()).

0 голосов
/ 14 сентября 2011

Это, вероятно, излишне для вашего примера, но вы можете узнать о Имене именованных параметров .

0 голосов
/ 14 сентября 2011

C ++ не поддерживает именованные параметры, так что это:

int main()
{ 
  foo first(a=1); 
  foo first(b=2); 
} 

Не законно. У вас также есть несколько неуникальных идентификаторов (например, first).

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