Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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. Как я понял: class lessons { int intVar; ...

12
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:26 #2
когда конструктор один, и нужно вызывать именно его
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
30.03.2012, 17:27  [ТС] #3
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
а иначе будет неявное преобразование или что-то типа того?
0
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
30.03.2012, 17:28 #4
иначе поля пустые будут либо не тем, чем надо проинициализируются
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
30.03.2012, 17:31  [ТС] #5
и последнее: можете привести пример, когда написание explicit принципиально важно?
0
Nick Alte
Эксперт С++
1644 / 1016 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
30.03.2012, 18:46 #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 мы получим на такой конструкции ошибку
}
1
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.03.2012, 18:51 #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/eb03fda068f639e9a7d7b1e5976c0295

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/301ba23ca7ae410019a2862a7bab6f3f
7
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
30.03.2012, 19:44 #8
Цитата Сообщение от panicwassano Посмотреть сообщение
когда конструктор один, и нужно вызывать именно его
Цитата Сообщение от panicwassano Посмотреть сообщение
иначе поля пустые будут либо не тем, чем надо проинициализируются
Поясните?
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
31.03.2012, 12:16  [ТС] #9
да, panicwassano, можете разъяснить? а то непонятно, когда использование важно на результате, а не на ошибках компилятора.
Ну и если используется
C++
1
2
3
4
5
class Foo
{
  explicit Foo
  ...
}
зачем все-таки его использовать?
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.03.2012, 13:45 #10
использую explicit (как уже было сказано) для запрета неявного преобразования и соответсвенно избежания вызова конструктора копии
C++
1
2
3
myclass obj(100500); //вызов конструктора с одним параметром
myclass obj2 = 100500; //вызов конструктора с одним параметром + вызов конструктора копии
//c explicit последняя инициализация невозможна
2
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
31.03.2012, 18:20 #11

Не по теме:

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



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

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

C++
1
2
CCounter counter(20, 5);
counter  = 10;
эквивалентно:
C++
1
2
CCounter counter(20, 5);
counter  = CCounter(10, 0);
1
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
31.03.2012, 19:53 #13
panicwassano, не эквивалентно, если только второй параметр у конструктора CCounter не задан по умолчанию. Писать explicit имеет смысл только для тех конструкторов, которые могут быть вызваны с одним аргументом. Заметьте, я говорю "могут быть вызваны", потому что они могут принимать и 10 параметров, но если все, кроме первого, заданы по умолчанию, то конструктор можно вызвать с одним аргументом, и если он не объявлен как explicit, то такой конструктор можно использовать и для неявного преобразования.
Тем не менее я понял, что вы имели ввиду в 4 посте, хотя это только один из возможных побочных эффектов, проявляющийся, к тому же, только при определённых условиях. Я так и не понял, что имелось ввиду во 2-м посте, но ладно, оставим это))
3
31.03.2012, 19:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2012, 19:53
Привет! Вот еще темы с ответами:

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

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

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны - C++
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов массива, равных 0; 2) сумму элементов...

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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