2015-09-23 3 views
4

Я хочу инициализировать m в конструкторе A. Является ли выражение круглых скобок с некоторыми параметрами непосредственно после имени класса (std::vector<double>) законным?В скобках сразу после имени класса создается новый экземпляр?

И что разница между Array m(n,0.0) и m=Array(n,0.0)?

+4

Обратите внимание, что предпочтительный способ сделать это - использовать список инициализаторов: 'A :: A (int n): m (n, 0.0) {}' Это непосредственно вызывает конструктор для m member без каких-либо копий или накладных расходов. См. Http://en.cppreference.com/w/cpp/language/initializer_list – SirDarius

+0

Является ли это новым стандартом C++? – edmz

+1

@black Нет, это не так. –

ответ

5
  1. Да, это законно. ClassName() вызывает конструктор этого класса.

    Примечание: Технически, конструктор не имеет имени, поэтому он не может быть найден во время поиска имени, так ClassName() действительно явное преобразование типа с использованием функционального обозначения, _results in_ вызова конструктора (как на стандарт C++ 12.1.2).

  2. Array m(n,0.0) создает переменную m класса Array, вызвав Array «s конструктора, который принимает 3 параметр.

    MyClass m = Array(n,0.0) создает безымянный переменную класса Array путем вызова конструктора Array «s с 3 параметрами, а затем копирует эту безымянную переменную в m, но, скорее всего, компилятор будет оптимизировать, что благодаря copy elision. Однако, если вы изменили это на MyClass m; m = Array(n,0.0), будет вызываться конструктор, за которым следует оператор присваивания.

+0

@TartanLlama, я не хотел чрезмерно усложнять ответ, но я добавил это как примечание. Что касается эмиссионного копирования, я тестировал его, и он действительно лидирует, но я немного отредактировал ответ, чтобы избежать недоразумений – SingerOfTheFall

Смежные вопросы