
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 15 16 [17] 18 19 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#241
,
|
|
|
Сообщ.
#242
,
|
|
|
Что-то в рабочем дравте не нашел Prohibited access specifier
Значит не будет? |
Сообщ.
#243
,
|
|
|
Цитата Большой @ Значит не будет? Видимо, не будет. Будут deleted определения. ![]() ![]() struct X { X(X &) = delete; // запрет на использование копирующего конструктора void operator =(X) = delete; // запрет на использование копирующего оператора присваивания }; |
Сообщ.
#244
,
|
|
|
Masterkent
а default, что значит? |
![]() |
Сообщ.
#245
,
|
|
Большой, см первый пост, поиск по заголовку "Defaulted and Deleted Functions". Или у тебя более конкретный вопрос есть?
|
Сообщ.
#246
,
|
|
|
archimed7592
почитал совершенно непонятно. Единственное что понял, что default функции можно реализовывать как непосредственно в определении класса так и в не его. Возможно default значит, что компилятор должен использовать "свои" версии функций обычно реализованные компилятором если пользователь их не определяет. Или это значит что-то иное? |
![]() |
Сообщ.
#247
,
|
|
Большой, ну, к примеру, ты не хочешь модифицировать тело деструктора, но ты хочешь сделать его виртуальным:
![]() ![]() struct X { virtual ~X() = default; } Цитата Большой @ Возможно default значит, что компилятор должен использовать "свои" версии функций обычно реализованные компилятором если пользователь их не определяет. Дело в том, что если пользователь их не определяет, то компилятор и так воспользуется "своими" реализациями. Другое дело, когда пользователь их определяет - иногда, пользователю действительно необходимо определить свою версию деструктора(к примеру), но когда у него нет необходимости определять свой деструктор, а добавить виртуальность или изменить модификатор доступа(private/protected/public) хочется - тогда он может и сообщить компилятору о необходимых изменениях и оставить за компилятором реализацию по умолчанию. К примеру, если есть желание сделать конструктор копирования protected, то можно увидеть разницу в количестве кода и потенциальной ошибке при добавлении новых полей и НЕредактировании конструктора: ![]() ![]() // C++03 struct X : B1, B2, ..., Bn { T1 f1; T2 f2; // ... Tn fn; protected: X(const X ©) : B1(copy), B2(copy), ..., Bn(copy), f1(copy.f1), f2(copy.f2), ..., fn(copy.fn) { } } // C++09 struct X : B1, B2, ..., Bn { T1 f1; T2 f2; // ... Tn fn; protected: X(const X ©) = default; } Заметь, при добавлении поля fn+1 или базового класса Bn+1 ничего редактировать в конструкторе не придётся. |
Сообщ.
#248
,
|
|
|
archimed7592
все равно не понятно а не проще тогда вообще не писать конструктор копирования (в этом случае компилер создаст свой конструктор копирования, работающего по принципу побитового копирования ) |
Сообщ.
#249
,
|
|
|
Цитата Большой @ все равно не понятно а не проще тогда вообще не писать конструктор копирования (в этом случае компилер создаст свой конструктор копирования, работающего по принципу побитового копирования ) Во-первых, не побитового, а поэлементного, а во-вторых - нет, не проще, т. к. в данном случае (если ты обратишь внимание) требование - чтобы конструктор бы protected. А компилятор по умолчанию сгенерирует public. Понятна разница? |
Сообщ.
#250
,
|
|
|
Цитата archimed7592 @ Большой, ну, к примеру, ты не хочешь модифицировать тело деструктора, но ты хочешь сделать его виртуальным: с этим понятно, а с конструктором копий нет Добавлено Цитата Flex Ferrum @ Во-первых, не побитового, а поэлементного, Саттер пишет что побитовое, а с конструктором копий понятно, не сразу обратил внимание на protected ![]() |
![]() |
Сообщ.
#251
,
|
|
Цитата Большой @ с этим понятно, а с конструктором копий нет Нужно, чтобы "конструктор копий" был protected. ![]() ![]() struct A { }; struct B { protected: B(const B ©) = default; }; int main() { A a1; A a2 = a1; // OK B b1; B b2 = b1; // error } Понятно, что будет, если "вообще не писать конструктор копирования"? |
Сообщ.
#252
,
|
|
|
А если попробовать так?
![]() ![]() struct A { A(int _a) {} A()=default; }; будет работать? |
![]() |
Сообщ.
#253
,
|
|
Цитата Большой @ будет работать? Что именно? |
Сообщ.
#254
,
|
|
|
ну первый и второй конструктор
|
![]() |
Сообщ.
#255
,
|
|
Ну да. Кстати говоря - вот тебе ещё одно применение default.
|