Приведение типов конструктора в C ++ - PullRequest
1 голос
/ 21 апреля 2010

Возьмите следующий класс:

     class mytype {
        double num;
     public:
        mytype(int a) {
           num = sqrt(a);
        }
        void print() {
           cout << num;
        }
     }

Скажем, есть метод, который принимает mytype:

 void foo(mytype a) {
    a.print();
 }

Является ли законным c ++ (или есть способ реализовать это) для вызова foo (4), который (теоретически) вывел бы 2? Из того, что я могу почерпнуть, вы можете перегружать приведение типов из определенного пользователем класса, но не для этого. Может конструктор сделать это в соответствии со стандартами (при условии, конечно, конструктор не является явным). Надеемся, что в конце концов есть законный закон:

 int a;
 cin >> a;
 foo(a);

Примечание: это, очевидно, не актуальная проблема, а просто пример для публикации. Я не могу просто перегрузить функцию из-за наследования и других проблем, связанных с программой.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Да. На самом деле это действие по умолчанию , если объявление вашего класса #include d.

Чтобы запретить это, ваш конструктор класса должен быть объявлен explicit. Обратите внимание, что только конструкторы, которые принимают один параметр (или конструкторы, в которых каждый аргумент после первого имеет значение по умолчанию), могут использовать приведение типа.

Хорошей практикой считается сделать все конструкторы explicit, если не требуется особо. Обратите внимание, что даже если ваш конструктор является явным , вы все равно можете выполнить анонимное преобразование: foo(mytype(4));

1 голос
/ 21 апреля 2010

Вы можете определить преобразования из нативных типов в качестве конструкторов, подобных этим, и преобразования в нативные типы, такие как operator int().

Единственным ограничением является то, что вы не можете переопределить преобразование между нативными типами или (пере) определить операторы, работающие только с нативными типами, или определить некоторые операторы вообще вне их класса операндов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...