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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 96, средняя оценка - 4.81
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
#1

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

30.03.2012, 17:24. Просмотров 13763. Ответов 12
Метки нет (Все метки)

Зачем нужен explicit разобрался. Но, возник вопрос: зачем его писать? когда Вы его пишете? вроде я как-то обходился без него
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2012, 17:24     Когда писать explicit
Посмотрите здесь:

когда в конце несколько ответов то что нужно писать чтоб они через пробел выдавались - C++
У меня вопрос такой: вот когда в конце несколько ответов то что нужно писать чтоб они через пробел выдавались а то у меня набор цифр...

inline explicit - C++
Почему ошибка? #include <iostream> class A { int i; public: explicit A(int x = 0); void show() {std::cout << "i = "...

неоднозначность, explicit - C++
Добрый вечер. написал такой шаблонный класс: template <class T> class Container { private: ...... public: ...

explicit и последствия. - C++
Здравствуйте. Как я узнал, в С++ есть ключевое слово explicit, применяемое к конструкторам с одним параметром ( или, как я понял, большим...

Explicit в конструкторе - C++
Ключевое слово explicit перед конструктором служит лишь для того чтобы не запутаться и передавать аргумент в конструктор явно? Например: ...

Целевой explicit конструктор - C++
Добрый день. Есть код struct Foo { explicit Foo() { }

Explicit и его назначение - C++
Собственно, полазив по гуглу и по учебнику так и не понял всей сущности explicit. Как я понял: class lessons { int intVar; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:26     Когда писать explicit #2
когда конструктор один, и нужно вызывать именно его
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
30.03.2012, 17:27  [ТС]     Когда писать explicit #3
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
а иначе будет неявное преобразование или что-то типа того?
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:28     Когда писать explicit #4
иначе поля пустые будут либо не тем, чем надо проинициализируются
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
30.03.2012, 17:31  [ТС]     Когда писать explicit #5
и последнее: можете привести пример, когда написание explicit принципиально важно?
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
30.03.2012, 19:44     Когда писать explicit #8
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
Цитата Сообщение от panicwassano Посмотреть сообщение
иначе поля пустые будут либо не тем, чем надо проинициализируются
Поясните?
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
31.03.2012, 12:16  [ТС]     Когда писать explicit #9
да, panicwassano, можете разъяснить? а то непонятно, когда использование важно на результате, а не на ошибках компилятора.
Ну и если используется
C++
1
2
3
4
5
class Foo
{
  explicit Foo
  ...
}
зачем все-таки его использовать?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
31.03.2012, 18:20     Когда писать explicit #11

Не по теме:

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



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

Добавлено через 4 минуты
Прошу прощения, если оставить конструктор копии без реализации, но оставить его в public-секции, всё будет работать. Для компилятора главное, чтобы конструктор копии при таком вызове был доступен, он не будет пытаться его вызывать.
panicwassano
591 / 559 / 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
Еще ссылки по теме:

explicit конструктор и перегрузки в классе - C++
class Test { public: Test () { printf(&quot;Simple constructor\n&quot;); } Test (long) {...

Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию? - C++
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию? 2) правильно ли...

Когда нужно использовать &ссылки ,а когда *указатели? - C++
Желательно с примерами

Когда запускаю и ввожу параметры, то, в момент когда программа должна выполнять действие, пишет ошибку - C++
Недавно начали изучать c++. так как в школе не было программирования (преподу пофиг было) я в универе отстаю ;c Написал программу по...

Перестало выводить, когда задание списков перевел в конструкторы, когда были просто функции выводило нормально. - C++
Не могу понять почему не выводит список на экран Перестало выводить, когда задание списков перевел в конструкторы, когда были просто...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru