Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Aqua77
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433
#1

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

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

Ключевое слово explicit перед конструктором служит лишь для того чтобы не запутаться и передавать аргумент в конструктор явно? Например:
http://www.cyberforum.ru/cpp-beginners/thread412305.html

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++):

inline explicit
Почему ошибка? #include <iostream> class A { int i; public:...

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

Explicit и его назначение
Собственно, полазив по гуглу и по учебнику так и не понял всей сущности...

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

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

7
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 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Эксперт С++
4648 / 1962 / 292
Регистрация: 20.02.2013
Сообщений: 5,222
Записей в блоге: 23
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 / 19
Регистрация: 13.07.2015
Сообщений: 433
05.11.2015, 10:15  [ТС] #4
Цитата Сообщение от gru74ik Посмотреть сообщение
автоматическая
функция преобразования типов
Это как?

Добавлено через 3 минуты
Цитата Сообщение от gru74ik Посмотреть сообщение
совсем не надо, чтобы второй конструктор (который с одним аргументом) преобразовывал тип int
А если передать так class Matrix(8); // Так же можно
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 292
Регистрация: 20.02.2013
Сообщений: 5,222
Записей в блоге: 23
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 / 19
Регистрация: 13.07.2015
Сообщений: 433
05.11.2015, 13:02  [ТС] #6
Спасибо, я скачал книгу дома почитаю. В общем суть в том чтобы передавать аргумент в конструктор тот, который мне действительно нужен, и чтобы конструктор не работал как преобразования. Хотя можно просто следить за кодом и не делать того что не надо. Помоему explicit не столь важная часть программы, я не могу представить код где бы explicit было необходимо.
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
05.11.2015, 13:11 #7
Цитата Сообщение от Aqua77 Посмотреть сообщение
Хотя можно просто следить за кодом и не делать того что не надо. Помоему explicit не столь важная часть программы, я не могу представить код где бы explicit было необходимо.
Современные средства программирования условно можно разделить на две составляющие. Средства решения задачи и средства повышения выразительности.
Первое - это очень минимальный набор, по сути тут можно ограничиться даже ассемблером платформы и дальше не идти. Второе - это все остальное. Например классы. Можно ли без классов писать программы? Конечно да. Абсолютно любую программу с классами можно переписать без них. Или вот, мой любимый пример - const. Можно же сказать: "зачем мне const, я же и так могу следить за тем что изменяется, а что нет".
Что классы, что const, что explicit - это все средства повышения выразительности. Они нужны, чтобы программы было писать легче, самое главное, чтобы их было легче сопровождать и изменять. Полезность этого не будет заметна на тестовых примерах в 100 строчек. А вот на больших проектах - да.
2
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 292
Регистрация: 20.02.2013
Сообщений: 5,222
Записей в блоге: 23
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 конструктор и перегрузки в классе
class Test { public: Test () { printf(&quot;Simple...

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

Шаблон в конструкторе
class A { template &lt;class Type&gt; A(Type Object) { } friend class...

Двоеточие в конструкторе
class A { public: A(): }; Что означает двоеточие и что...


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

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

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