Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/149: Рейтинг темы: голосов - 149, средняя оценка - 4.99
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2

Когда писать explicit

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

Студворк — интернет-сервис помощи студентам
Зачем нужен explicit разобрался. Но, возник вопрос: зачем его писать? когда Вы его пишете? вроде я как-то обходился без него
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2012, 17:24
Ответы с готовыми решениями:

Когда нужно писать один значок &(и) а когда нужно писать два значка &&(ии)?
Когда нужно писать один значок &(и) а когда нужно писать два значка &&(ии)?

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

Когда нужно писать скобки после функции а когда нет?
Здравствуйте.Хотел вот задать такой простенький вопрос на примере моего кода. <form> <input type="text"...

12
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:26
когда конструктор один, и нужно вызывать именно его
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
30.03.2012, 17:27  [ТС]
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
а иначе будет неявное преобразование или что-то типа того?
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:28
иначе поля пустые будут либо не тем, чем надо проинициализируются
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
30.03.2012, 17:31  [ТС]
и последнее: можете привести пример, когда написание explicit принципиально важно?
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
30.03.2012, 18:46
Вот пожалуйста:
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 мы получим на такой конструкции ошибку
}
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.03.2012, 18:51
Лучший ответ Сообщение было отмечено как решение

Решение

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/... e5976c0295

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/... 2a7bab6f3f
9
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
30.03.2012, 19:44
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
Цитата Сообщение от panicwassano Посмотреть сообщение
иначе поля пустые будут либо не тем, чем надо проинициализируются
Поясните?
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.03.2012, 12:16  [ТС]
да, panicwassano, можете разъяснить? а то непонятно, когда использование важно на результате, а не на ошибках компилятора.
Ну и если используется
C++
1
2
3
4
5
class Foo
{
  explicit Foo
  ...
}
зачем все-таки его использовать?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
31.03.2012, 13:45
использую explicit (как уже было сказано) для запрета неявного преобразования и соответсвенно избежания вызова конструктора копии
C++
1
2
3
myclass obj(100500); //вызов конструктора с одним параметром
myclass obj2 = 100500; //вызов конструктора с одним параметром + вызов конструктора копии
//c explicit последняя инициализация невозможна
2
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
31.03.2012, 18:20

Не по теме:

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



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

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

C++
1
2
CCounter counter(20, 5);
counter  = 10;
эквивалентно:
C++
1
2
CCounter counter(20, 5);
counter  = CCounter(10, 0);
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
31.03.2012, 19:53
panicwassano, не эквивалентно, если только второй параметр у конструктора CCounter не задан по умолчанию. Писать explicit имеет смысл только для тех конструкторов, которые могут быть вызваны с одним аргументом. Заметьте, я говорю "могут быть вызваны", потому что они могут принимать и 10 параметров, но если все, кроме первого, заданы по умолчанию, то конструктор можно вызвать с одним аргументом, и если он не объявлен как explicit, то такой конструктор можно использовать и для неявного преобразования.
Тем не менее я понял, что вы имели ввиду в 4 посте, хотя это только один из возможных побочных эффектов, проявляющийся, к тому же, только при определённых условиях. Я так и не понял, что имелось ввиду во 2-м посте, но ладно, оставим это))
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2012, 19:53
Помогаю со студенческими работами здесь

Как понять, когда писать через точку (например, TextBlock.ToolTip), а когда не через точку?
&lt;StackPanel&gt; &lt;TextBlock Text=&quot;TextTooltip 1&quot; ToolTip=&quot;Hello Tooltip&quot; /&gt; &lt;TextBlock Text=&quot;TextTooltip 2&quot;&gt; ...

Когда писать public?
class CreateJSON{ function InspectionFile( $JSONfile ){ if( file_exists( $JSONfile ) ): $generate_file = fopen( $JSONfile, 'w'...

Учимся писать грамотно: правописание местоимений - когда пишется "вы", а когда "Вы"?
Ну, слово &quot;неправильно&quot; вы точно пишете неправильно!

когда писать php код
вопрос может быть странный но вот имеет смысл когда писать код: после того как выкладывать его на хостинг или можно и без него писать. ну...

Когда начинать писать Платону?
Спросил у Яши седня утром про то скока моего сайта в индексе (#url=&quot;site.ru*&quot;), а он мне &quot;Искомая комбинация слов нигде не...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru