Присвоение по сравнению с инициализацией в C++

Я думал, что конструкторы управляют инициализацией и оператором = присвоение управления функциями в C++. Итак, почему это кодирует работу?

#include <iostream>
#include <cmath>
using namespace std;

class Deg {
    public:
        Deg() {}
        Deg(int a) : d(a) {}        
        void operator()(double a)
        {
            cout << pow(a,d) << endl;
        }

    private:
        int d;
};

int
main(int argc, char **argv) 
{
    Deg d = 2;
    d(5);
    d = 3; /* this shouldn't work, Deg doesn't have an operator= that takes an int */
    d(5);
    return 0;
}

На третьей строке основной функции я присваиваюсь int к объекту класса Deg. Так как я не имею operator=(int) функция, я думал, что это, конечно, перестанет работать..., но вместо этого она звонит Deg(int a) конструктор. Конструкторы управляют присвоением также?

7
задан Vlad the Impala 20 February 2010 в 18:02
поделиться

2 ответа

Это то, что называется неявным преобразованием типов. Компилятор посмотрит, есть ли конструктор, который напрямую изменит тип, который вы назначаете, на тип, который вы пытаетесь назначить, и вызовет его. Вы можете предотвратить это, добавив ключевое слово explicit перед конструктором, который вы не хотели бы неявно вызывать, например:

явное Deg (int a): d (a) { }

18
ответ дан 6 December 2019 в 08:14
поделиться

Чтобы прояснить ответ JonM:

Для строки d = 3 задействован оператор присваивания . 3 неявно конвертируется в Deg , как сказал JonM, а затем Deg назначается на d ] с помощью оператора присваивания, созданного компилятором (который по умолчанию выполняет присваивание по каждому элементу). Если вы хотите предотвратить присвоение, вы должны объявить частный оператор присваивания (и не реализовывать его):

//...
private:
    Deg& operator=(const Deg&);
}
4
ответ дан 6 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

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