|
|
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
SashaMercury2.1 Правильный ли вывод: При разработке ПО желательно инициализировать объекты при их создании. В ООП каждый объект должен быть проинициализирован при создании. Можно ли считать это одной из важны деталей ООП ? Хорошим тоном сейчас является RAII . Предполагается, что для отказа от данного принципа в каждом конкретном случае должны быть очень веские и явно и четко формулируемые причины. Одной из таких может быть "дороговизна" операции инициализации. Как говорится, делайте так, если у Вас нет _веских_ причин делать иначе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2015, 21:39:41 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
MozokSashaMercury1.3 Как осуществляется защита от злонамеренного доступа к закрытым полям класса ? Pimpl . Я не уверен, что именно защита от "целеустремлённого настойчивого буратины". Для особо настойчивых просто добавляется необходимость взятия ещё одного адреса расчёта смещения. Мне кажется, что гораздо более существенными фишками этой техники являются (b) adding new data members to the private struct does not affect binary compatibility; (c) the header file containing the class declaration only needs to #include those other files needed for the class interface, rather than for its implementation. One side benefit is that compilations are faster because the header file changes less often. . Что, собственно, есть способ отделения интерфейса от реализации (без болезней типа необходимости пересобрать всё-всё только из-за изменения одной строчки в хедере). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2015, 21:44:57 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. BS пишет: A constructor is recognized by having the same name as the class itself. И не только он, многие говорят о том, что конструктор имеет имя класса которому он принадлежит. Однако в стандарте действительно(как сказал выше Mozok ) сказано: Constructor do not have names. Согласно стандарту существует специальный синтаксис объявления конструктора. Не читал далее, но вероятнее всего такой синтаксис существует для всех special member function. Mozok, всё что вы сказали, я понял, несмотря на то, что не до конца понимаю причину некоторых вещей, но она видимо глубже нежели анализ конструкторов. Но вы также говорите что нельзя конструктор явно вызывать. Как я понял, реализация может неявно определить все или некоторые special member function в том случае, если они не определены явно разработчиком. В таком случае, если программист явно определяет, fe, default constructor, он и будет явно вызываться при создании объекта без использования параметров. Разве в данном случае это не будет явным вызовом конструктора по умолчанию ? Читая стандарт, мне показалось что смысловая нагрузка слов: имплицитно и эксплицитно в контексте ООП в С++ несколько иная. Или ошибаюсь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 02:52:48 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЗдравствуйте. BS пишет: A constructor is recognized by having the same name as the class itself. И не только он, многие говорят о том, что конструктор имеет имя класса которому он принадлежит. Однако в стандарте действительно(как сказал выше Mozok ) сказано: Constructor do not have names. Согласно стандарту существует специальный синтаксис объявления конструктора.И что тебя смущает? В одном случае говорится про определение, в другом про представление. SashaMercuryКак я понял, реализация может неявно определить все или некоторые special member function в том случае, если они не определены явно разработчиком.Реализация ничего определить не может. По определению самой реализации. А вот компилятор действительно делает реализацию всех недостающих обязательных членов класса. SashaMercury В таком случае, если программист явно определяет, fe, default constructor, он и будет явно вызываться при создании объекта без использования параметров. Разве в данном случае это не будет явным вызовом конструктора по умолчанию ?Не существует "конструктора по умолчанию". Есть просто разные конструкторы, с параметрами и без. А какой из них будет вызван зависит от уже от того как ты будешь создавать объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 05:27:11 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
White OwlSashaMercuryЗдравствуйте. BS пишет: A constructor is recognized by having the same name as the class itself. И не только он, многие говорят о том, что конструктор имеет имя класса которому он принадлежит. Однако в стандарте действительно(как сказал выше Mozok ) сказано: Constructor do not have names. Согласно стандарту существует специальный синтаксис объявления конструктора.И что тебя смущает? В одном случае говорится про определение, в другом про представление. В стандарте нет определения того, что такое представление, что вы имеете ввиду и почему используете этот термин ? Меня смущает, что слова name и constructor находятся в одном предложении, и это не предложение Constructor do not have names. И такое не только у BS. В стандарте чётко написано: Constructors do not have names. A special declarator syntax is used to declare or define the constructor. Потому не надо ассоциировать имя класса и конструктор. У конструктора нет имени, существует только синтаксис определения и объявления конструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 06:40:03 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
White Owl Реализация ничего определить не может. По определению самой реализации. А вот компилятор действительно делает реализацию всех недостающих обязательных членов класса. Тогда как вы переведёте такую фразу, fe: ISO/IEC N3242=11-0012 12.1 Special member functionsThe implementation will implicitly declare these members functions for some class types when the program does not explicitly declare them. The implementation will implicitly defined them if they are odr-use. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 06:47:05 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
White Owl Не существует "конструктора по умолчанию". В стандарте описан default constructor. A default constructor for a class X is constructor of class X that can be called without an argument. Единственное что меня смущает, я выделил красным. Видимо реализация языка в VS не совсем корректная, ибо они реализовали не can be, a must be. Такой код, например, выдаст ошибку на этапе компиляции Код: plaintext 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. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 07:52:11 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Скобки убери, тогда скомпилируется. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 08:02:09 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Нет, я не так понял. В стандарте написано о том, что вызов может быть без аргументов. Так он и должен быть без аргументов. Но и синтаксис вызова должен быть иной. Вот так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 08:02:24 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Dima TСкобки убери, тогда Код: plaintext 1. 2. 3. Безусловно. Изначально подумал что и такой синтаксис должен работать Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 08:06:36 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryИзначально подумал что и такой синтаксис должен работать Код: plaintext 1. Тоже вполне нормальный код - объявление функции, возвращающей X. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 09:28:22 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
wstSashaMercuryИзначально подумал что и такой синтаксис должен работать Код: plaintext 1. Тоже вполне нормальный код - объявление функции, возвращающей X. Вероятно поэтому синтаксис использования конструктора по умолчанию имеет такой вид X x.3048 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 10:02:00 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВероятно поэтому синтаксис использования конструктора по умолчанию имеет такой вид X xне вероятно - очевидно )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 10:06:35 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Читаю топик и меня не покидает ощущение вязкого затягивающего кошмара. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 11:20:49 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
maytonЧитаю топик и меня не покидает ощущение вязкого затягивающего кошмара. Почему ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 12:27:47 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВ стандарте нет определения того, что такое представление, что вы имеете ввиду и почему используете этот термин ? Термин «представление» в мире С++ не используется. Есть «объявление (declaration)» и «определение (definition)». Они могут совпадать в коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 12:34:29 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНо вы также говорите что нельзя конструктор явно вызывать. Можно и так всегда делают. Более того: - Можно вызвать конструктор повторно. - Конструктор можно явно вызвать для произвольного участка памяти. - Можно явно вызвать деструктор. Но это редко нужно и требует серьезного обоснования и глубоких знаний. SashaMercuryВ таком случае, если программист явно определяет, fe, default constructor, он и будет явно вызываться при создании объекта без использования параметров. Что такое «fe»? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 12:40:13 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
SashaMercurymaytonЧитаю топик и меня не покидает ощущение вязкого затягивающего кошмара. Почему ? Обычно топик заканчивается либо решением проблемы. Либо каждый для себя делает выводы. А тут - философский пинг-понг. Что то тип: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 14:28:06 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
[quot mayton Код: plaintext 1. 2. 3. 4. 5. 6. [/quot]тебе отсыпать опилок? ;) у меня свежие есть ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 14:29:41 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
petrav- Можно вызвать конструктор повторно. Это как? Надеюсь, не имелся в виду вызов конструкторов по цепочке, как в Java. petrav- Конструктор можно явно вызвать для произвольного участка памяти. И это как? placement new не предлагать, это вызов operator new, а не коструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 18:47:27 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Так placement new и есть только вызов конструктора. n4527.pdf§18.4.1.3 Placement forms These functions are reserved, a C++ program may not define functions that displace the versions in the Standard C++ library. ... void* operator new(std::size_t size, void* ptr) noexcept; Returns: ptr. Remarks: Intentionally performs no other action. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 18:58:48 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Mozokpetrav- Можно вызвать конструктор повторно. Это как? Надеюсь, не имелся в виду вызов конструкторов по цепочке, как в Java. petrav- Конструктор можно явно вызвать для произвольного участка памяти. И это как? placement new не предлагать, это вызов operator new, а не коструктора. placement new -- это как раз вызов конструктора, а не operator new. operator new -- это создание объекта в памяти (выделение памяти) и затем его инициализация путём вызова одного из конструкторов. placement new -- напротив, только инициализация объекта в памяти путём вызова одного из конструкторов . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 19:00:38 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
Mozokpetrav- Можно вызвать конструктор повторно. Это как? Надеюсь, не имелся в виду вызов конструкторов по цепочке, как в Java. petrav- Конструктор можно явно вызвать для произвольного участка памяти. И это как? placement new не предлагать, это вызов operator new, а не коструктора. Вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Я, правда, считал, что можно напрямую вызвать конструктор как-то так: Код: plaintext 1. Не компилируется, но это ничего не меняет. Что там с цепочками в Яве я не знаю. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 21:05:54 |
|
||
|
Некоторые вопросы о программировании на C++
|
|||
|---|---|---|---|
|
#18+
petravЧто там с цепочками в Яве я не знаю. :( Что за цепочки? "Method chaining"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2015, 22:04:51 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39051396&tid=2018842]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 515ms |

| 0 / 0 |
