класс имя класса (значение);& class classname = значение;разница, когда конструктор явный - PullRequest
0 голосов
/ 17 января 2011

Когда конструктор явный, он не используется для неявных преобразований.В данном фрагменте конструктор помечен как explicit.Тогда почему в случае foo obj1(10.25); это работает, а в foo obj2=10.25; это не работает?

#include <iostream>
class foo
{
    int x;
    public:
    explicit foo( int x ):x(x)
    {}
};

int main()
{
    foo obj(10.25);  // Not an error. Why ?
    foo obj2 = 10.25; // Error
    getchar();
    return 0;
}

ошибка: ошибка C2440: «инициализация»: невозможно преобразовать из «двойной»'to' foo '

Ответы [ 4 ]

3 голосов
/ 17 января 2011

Эти две формы инициализации технически различны. Первый (foo obj(10.25);) называется прямой инициализацией. Второй (foo obj = 10.25;) называется инициализацией копирования.

explicit конструкторы могут использоваться только при явной инициализации объекта. Прямая инициализация - это одна из форм явной инициализации объекта. Другой формой явной инициализации является использование приведения.

1 голос
/ 17 января 2011

Есть разница между этими двумя строками кода. Первая строка,

foo obj(10.25);

явно вызывает ваш foo конструктор, передавая 10.25. Этот синтаксис, как правило, является вызовом конструктора.

Вторая строка,

foo obj2 = 10.25;

пытается неявно преобразовать 10.25 в объект типа foo, что потребует использования конструктора неявного преобразования. В этом примере вы пометили конструктор explicit, конструктор неявного преобразования недоступен, поэтому компилятор выдает ошибку.

1 голос
/ 17 января 2011

В первом случае вы не неявно преобразуете 10.25 в foo.Вы конвертируете его в int, так что это не ошибка.Выражение foo obj(10.25) рассматривается как прямой вызов конструктора для инициализации объекта foo.

Во втором случае вы пытаетесь неявно преобразовать 10.25 в foo.Конструктор, помеченный explicit, не будет рассматриваться (как вы правильно сказали), и поэтому вы получите ошибку.

1 голос
/ 17 января 2011

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

...