Форум программистов, компьютерный форум CyberForum.ru

Когда писать explicit - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 96, средняя оценка - 4.81
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.03.2012, 17:24     Когда писать explicit #1
Зачем нужен explicit разобрался. Но, возник вопрос: зачем его писать? когда Вы его пишете? вроде я как-то обходился без него
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:26     Когда писать explicit #2
когда конструктор один, и нужно вызывать именно его
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.03.2012, 17:27  [ТС]     Когда писать explicit #3
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
а иначе будет неявное преобразование или что-то типа того?
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:28     Когда писать explicit #4
иначе поля пустые будут либо не тем, чем надо проинициализируются
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.03.2012, 17:31  [ТС]     Когда писать explicit #5
и последнее: можете привести пример, когда написание explicit принципиально важно?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
30.03.2012, 18:46     Когда писать explicit #6
Вот пожалуйста:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Некий собственный класс динамического массива целых чисел
class MyArray {
public:
    MyArray(size_t initialSize);  // конструктор создаёт массив заданного размера и заполняет нулями
// ...
};
 
void foo(const MyArray& array)
{
// ...
}
 
int main()
{
    foo(MyArray(7));  // Обрабатываем массив-времянку из 7 нулей, по записи понятно
    foo(7);   // То же самое, обрабатываем массив-времянку из 7 нулей, но этого ли мы хотели?
                // Со словом explicit мы получим на такой конструкции ошибку
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.03.2012, 18:51     Когда писать explicit #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
template<class T>
class Pointer
{
public:
   Pointer(T* p):ptr(p)
   {
   }
   explicit operator bool()
   {
      return ptr;
   }
private:
   T* ptr;
};
 
int main()
{
   Pointer<int> ptr(new int(5));
   std::cout << ptr << std::endl;
}
http://liveworkspace.org/code/eb03fd...d7b1e5976c0295

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
template<class T>
class Pointer
{
public:
   Pointer(T* p):ptr(p)
   {
   }
   operator bool()
   {
      return ptr;
   }
private:
   T* ptr;
};
 
int main()
{
   Pointer<int> ptr(new int(5));
   std::cout << ptr << std::endl;
}
http://liveworkspace.org/code/301ba2...a2862a7bab6f3f
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.03.2012, 19:44     Когда писать explicit #8
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
Цитата Сообщение от panicwassano Посмотреть сообщение
иначе поля пустые будут либо не тем, чем надо проинициализируются
Поясните?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
31.03.2012, 12:16  [ТС]     Когда писать explicit #9
да, panicwassano, можете разъяснить? а то непонятно, когда использование важно на результате, а не на ошибках компилятора.
Ну и если используется
C++
1
2
3
4
5
class Foo
{
  explicit Foo
  ...
}
зачем все-таки его использовать?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.03.2012, 13:45     Когда писать explicit #10
использую explicit (как уже было сказано) для запрета неявного преобразования и соответсвенно избежания вызова конструктора копии
C++
1
2
3
myclass obj(100500); //вызов конструктора с одним параметром
myclass obj2 = 100500; //вызов конструктора с одним параметром + вызов конструктора копии
//c explicit последняя инициализация невозможна
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
31.03.2012, 18:20     Когда писать explicit #11

Не по теме:

Мне лично интересно, что скажет именно panicwassano. Я не понял, что он имел ввиду...



Добавлено через 4 минуты
Кстати, вторая строка в коде Jupiterа любым вменяемым компилятором будет преобразована в вызов всего лишь одного конструктора - конструктора инициализации (ЕМНИП это даже оговорено в стандарте), однако если отправить конструктор копии в privat-секцию или оставить без реализации, код не скомпилируется (это всё с учётом того, что конструктора мы не объявляли как explicit), потому что фактически конструктор копии не нужен (компилятор всегда обходится без него), но формально это преобразование происходит через конструктор копии, поэтому он должен быть доступен.

Добавлено через 4 минуты
Прошу прощения, если оставить конструктор копии без реализации, но оставить его в public-секции, всё будет работать. Для компилятора главное, чтобы конструктор копии при таком вызове был доступен, он не будет пытаться его вызывать.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
31.03.2012, 19:46     Когда писать explicit #12
silent_1991 я неправильно может выразился я имел ввиду это
Конструктор может быть помечен как явный при помощи ключевого слова explicit , чтобы запретить возможность его неявного вызова в ситуациях, вроде следующих:

C++
1
2
CCounter counter(20, 5);
counter  = 10;
эквивалентно:
C++
1
2
CCounter counter(20, 5);
counter  = CCounter(10, 0);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2012, 19:53     Когда писать explicit
Еще ссылки по теме:

C++ когда в конце несколько ответов то что нужно писать чтоб они через пробел выдавались
explicit конструктор и перегрузки в классе C++
C++ Explicit и его назначение

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
31.03.2012, 19:53     Когда писать explicit #13
panicwassano, не эквивалентно, если только второй параметр у конструктора CCounter не задан по умолчанию. Писать explicit имеет смысл только для тех конструкторов, которые могут быть вызваны с одним аргументом. Заметьте, я говорю "могут быть вызваны", потому что они могут принимать и 10 параметров, но если все, кроме первого, заданы по умолчанию, то конструктор можно вызвать с одним аргументом, и если он не объявлен как explicit, то такой конструктор можно использовать и для неявного преобразования.
Тем не менее я понял, что вы имели ввиду в 4 посте, хотя это только один из возможных побочных эффектов, проявляющийся, к тому же, только при определённых условиях. Я так и не понял, что имелось ввиду во 2-м посте, но ладно, оставим это))
Yandex
Объявления
31.03.2012, 19:53     Когда писать explicit
Ответ Создать тему
Опции темы

Текущее время: 04:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru