спасибо всем за ответы. После дальнейших исследований я нашел учебник, который реализует именно то, что я хотел. Как реализовать пользовательский макет, который принимает ввод пальцем или стилусом, а не клавиатурой
Foo f = 42;
Этот оператор сделает временный объект для значения '42'.
Foo f(42);
Этот оператор непосредственно присвоит значение так один меньше вызова функции.
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, и даже если у конструктора копии есть побочные эффекты. Это особенно включает видимого конструктора копии.