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

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

Войти
Регистрация
Восстановить пароль
 
Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 433
#1

Explicit в конструкторе - C++

05.11.2015, 09:11. Просмотров 594. Ответов 7
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class cla
{
  int a;
public:
  cla(int g)
   {
     a=g;
   }
};
int main()
{int j=8;
void viv(cla);
cla c1(8);
viv(j);//Например тут можно передать переменную int и она запишется в конструкторе. Чтобы этого небыло пишут explicit?
}
void viv(cla dd)
{
int h=dd.a
}
Какую ещё роль играет explicit
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2015, 09:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Explicit в конструкторе (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. Как я понял: class lessons { int intVar; ...

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

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

7
Croessmah
Пришел
Эксперт CЭксперт С++
13738 / 7818 / 891
Регистрация: 27.09.2012
Сообщений: 19,209
Записей в блоге: 3
Завершенные тесты: 1
05.11.2015, 09:15 #2
Вот
A constructor declared without the function-specifier explicit specifies a conversion from the types of its
parameters to the type of its class. Such a constructor is called a converting constructor.
...
An explicit constructor constructs objects just like non-explicit constructors, but does so only where the direct-initialization syntax (8.5) or where casts (5.2.9, 5.4) are explicitly used. A default constructor may be an explicit constructor; such a constructor will be used to perform default-initialization or value-initialization (8.5).
1
gru74ik
Эксперт CЭксперт С++
4277 / 1865 / 198
Регистрация: 20.02.2013
Сообщений: 4,997
Записей в блоге: 22
05.11.2015, 09:37 #3
Вот у Праты:
Цитата Сообщение от Стивен Прата
Конструктор C++, который принимает один аргумент, определяет преобразование типа аргумента
в тип класса. Если конструктор снабжен ключевым словом explicit, он может использоваться только
с явной формой преобразования, в противном случае допускается неявное преобразование.
<...>
Возможность применения конструктора, работающего как автоматическая
функция преобразования типов, кажется удобным средством. Но программисты,
накопившие определенный опыт работы с C++, обнаруживают, что автоматический аспект не
всегда желателен, поскольку иногда ведет к неожиданным преобразованиям. Поэтому в C++
добавлено новое ключевое слово explicit для отключения этого автоматического поведения.
Добавлено через 6 минут
Цитата Сообщение от Aqua77 Посмотреть сообщение
Ключевое слово explicit перед конструктором служит лишь для того чтобы не запутаться и передавать аргумент в конструктор явно?
Нет. Оно служит для того, чтобы конструктор не работал как конструктор преобразования. Например, нам совсем не надо, чтобы второй конструктор (который с одним аргументом) преобразовывал тип int в тип Matrix и мы ему запрещаем такое поведение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef MATRIX_H
#define MATRIX_H
 
#include <iostream>
 
typedef double Item;
 
class Matrix
{
private:
    int m_row;
    int m_col;
    Item ** matrix;
 
public:
    Matrix(int row, int col);
    explicit Matrix(int col);
    ~Matrix();
 
    void fill_rand(Item fromNum, Item toNum);
 
    friend std::ostream & operator<<(std::ostream & os, const Matrix & m);
};
 
#endif // MATRIX_H
2
Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 433
05.11.2015, 10:15  [ТС] #4
Цитата Сообщение от gru74ik Посмотреть сообщение
автоматическая
функция преобразования типов
Это как?

Добавлено через 3 минуты
Цитата Сообщение от gru74ik Посмотреть сообщение
совсем не надо, чтобы второй конструктор (который с одним аргументом) преобразовывал тип int
А если передать так class Matrix(8); // Так же можно
0
gru74ik
Эксперт CЭксперт С++
4277 / 1865 / 198
Регистрация: 20.02.2013
Сообщений: 4,997
Записей в блоге: 22
05.11.2015, 10:23 #5
Цитата Сообщение от Aqua77 Посмотреть сообщение
Это как?
Это так, что если конструктор имеет один аргумент, то он работает как конструктор преобразования и возможен такой код:
C++
1
Matrix my_matrix = 4; // Опа, тип int превратился в тип Matrix! Ты правда этого хотел?
А если ты хочешь запретить такое, то вот и пишешь перед конструктором explicit и тогда где-то в мэйне ты создаёшь переменную типа Matrix и...
C++
1
Matrix my_matrix = 4; // компилятор выдаёт ошибку - неявные преобразования запрещены!
Добавлено через 4 минуты
Aqua77, короче, тебе проще будет прочитать, чем мне тут пересказывать:
Стивен Прата - Язык программирования С++. Лекции и упражнения (2012, 6-е издание),
Глава 11 "Работа с классами", параграф "Автоматические преобразования и приведения типов в классах", стр. 572
3
Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 433
05.11.2015, 13:02  [ТС] #6
Спасибо, я скачал книгу дома почитаю. В общем суть в том чтобы передавать аргумент в конструктор тот, который мне действительно нужен, и чтобы конструктор не работал как преобразования. Хотя можно просто следить за кодом и не делать того что не надо. Помоему explicit не столь важная часть программы, я не могу представить код где бы explicit было необходимо.
0
DrOffset
7506 / 4502 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
05.11.2015, 13:11 #7
Цитата Сообщение от Aqua77 Посмотреть сообщение
Хотя можно просто следить за кодом и не делать того что не надо. Помоему explicit не столь важная часть программы, я не могу представить код где бы explicit было необходимо.
Современные средства программирования условно можно разделить на две составляющие. Средства решения задачи и средства повышения выразительности.
Первое - это очень минимальный набор, по сути тут можно ограничиться даже ассемблером платформы и дальше не идти. Второе - это все остальное. Например классы. Можно ли без классов писать программы? Конечно да. Абсолютно любую программу с классами можно переписать без них. Или вот, мой любимый пример - const. Можно же сказать: "зачем мне const, я же и так могу следить за тем что изменяется, а что нет".
Что классы, что const, что explicit - это все средства повышения выразительности. Они нужны, чтобы программы было писать легче, самое главное, чтобы их было легче сопровождать и изменять. Полезность этого не будет заметна на тестовых примерах в 100 строчек. А вот на больших проектах - да.
2
gru74ik
Эксперт CЭксперт С++
4277 / 1865 / 198
Регистрация: 20.02.2013
Сообщений: 4,997
Записей в блоге: 22
05.11.2015, 13:19 #8
Aqua77, вот, характерный например, так сказать.
0
05.11.2015, 13:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2015, 13:19
Привет! Вот еще темы с ответами:

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

При потсроении пишет что конструктор либо недоступен либо объявлен как explicit - C++
/*Все обьекты содержимые в контейнерах без проблем выводятся через потоковые итераторы и алгоритм copy. Но когда речь идет о собственных...

Двоеточие в конструкторе - C++
class A { public: A(): }; Что означает двоеточие и что туда надо писать?

Исключение в конструкторе - C++
#include &lt;iostream&gt; class Vect { public: Vect(char); ~Vect() { try { delete p; } catch (...) { std::cerr &lt;&lt; &quot;Cannot...


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

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

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