Синтаксис инициализации экземпляра C++ [дубликат]

спасибо всем за ответы. После дальнейших исследований я нашел учебник, который реализует именно то, что я хотел. Как реализовать пользовательский макет, который принимает ввод пальцем или стилусом, а не клавиатурой

11
задан 6 revs, 2 users 100% 22 July 2018 в 00:00
поделиться

2 ответа

Foo f = 42;

Этот оператор сделает временный объект для значения '42'.

Foo f(42);

Этот оператор непосредственно присвоит значение так один меньше вызова функции.

8
ответ дан 3 December 2019 в 03:37
поделиться
class Foo {
public:
    Foo(explicit int);

    Foo& operator=(int);
};

Это недопустимо. Синтаксис

class Foo {
public:
    explicit Foo(int);

    Foo& operator=(int);
};

Различие - то, что конструктор преобразования не может использоваться для неявных преобразований, когда Вы помещаете явный перед ним:

Foo f(10); // works
Foo f = 10; // doesn't work

Вышеупомянутое не имеет никакого отношения к оператору присваивания, который Вы объявили там. Это не используется, так как это - инициализация (только конструкторы используются). Следующее будет использовать оператор присваивания:

Foo f;
f = 10;

И будет использовать конструктора по умолчанию Foo (тот, берущий аргументы).


Править: Корреспондент изменил свой вопрос особенным методам ли

Foo f = 1; // called "copy initialization" 
Foo f(1);  // called "direct initialization"

То же. Ответ - то, что они эквивалентны следующему:

Foo f(Foo(1));
Foo f(1);

Если и только если конструктор преобразования, берущий интервал, не объявляется с ключевым словом explicit, иначе первой является ошибка компилятора (см. выше). Компилятору позволяют игнорировать (оптимизируйте), временный файл передал конструктору копии Foo в первом случае, если все семантические ограничения все еще safisfied, и даже если у конструктора копии есть побочные эффекты. Это особенно включает видимого конструктора копии.

19
ответ дан 3 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: