Я думал, что конструкторы управляют инициализацией и оператором = присвоение управления функциями в 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)
конструктор. Конструкторы управляют присвоением также?
Это то, что называется неявным преобразованием типов. Компилятор посмотрит, есть ли конструктор, который напрямую изменит тип, который вы назначаете, на тип, который вы пытаетесь назначить, и вызовет его. Вы можете предотвратить это, добавив ключевое слово explicit
перед конструктором, который вы не хотели бы неявно вызывать, например:
явное Deg (int a): d (a) { }
Чтобы прояснить ответ JonM:
Для строки d = 3
задействован оператор присваивания . 3
неявно конвертируется в Deg
, как сказал JonM, а затем Deg
назначается на d
] с помощью оператора присваивания, созданного компилятором (который по умолчанию выполняет присваивание по каждому элементу). Если вы хотите предотвратить присвоение, вы должны объявить частный оператор присваивания (и не реализовывать его):
//...
private:
Deg& operator=(const Deg&);
}