`
Читать книги » Книги » Компьютеры и Интернет » Программирование » Герб Саттер - Стандарты программирования на С++. 101 правило и рекомендация

Герб Саттер - Стандарты программирования на С++. 101 правило и рекомендация

1 ... 54 55 56 57 58 ... 62 ВПЕРЕД
Перейти на страницу:

Размер имеет значение. При замене указателя на Derived указателем на Base компилятор точно знает, как следует подкорректировать (при необходимости) указатель, поскольку у него есть достаточное количество информации об обоих классах. Однако при выполнении арифметических операций над указателем p на Base компилятор вычисляет p[n] как *(p+n*sizeof(Base)), таким образом полагаясь на то, что объекты, находящиеся в памяти, — это объекты типа Base, а не некоторого производного типа, который может иметь другой размер. Представляете, какая ерунда может получиться при работе с массивом объектов Derived, если вы преобразуете указатель на начало этого массива в указатель типа Base* (что компилятор вполне допускает), а затем примените арифметические операции к этому указателю (что компилятор также пропустит, не моргнув глазом)!

Такие неприятности представляют собой результат взаимодействия двух концепций — заменимости указателей на производный класс указателями на базовый класс, и унаследованной от С арифметикой указателей, которая считает указатели мономорфными и использует при вычислениях только статическую информацию.

Для хранения массива полиморфных объектов вам нужен массив (а еще лучше — контейнер; см. рекомендацию 77) указателей на базовый класс (например, обычных указателей или, что еще лучше, интеллектуальных указателей shared_ptr; см. рекомендацию 79). Тогда каждый указатель массива указывает на полиморфный объект, скорее всего, объект в динамически выделенной памяти. (Если вы хотите обеспечить интерфейс контейнера полиморфных объектов, вам надо инкапсулировать весь массив и предоставить соответствующий полиморфный интерфейс для выполнения итераций.)

Кстати, одна из причин, по которой в интерфейсах следует предпочитать ссылки указателям, заключается в том, чтобы было совершенно очевидно, что речь идет только об одном объекте, а не о массиве объектов.

Ссылки

[C++TR104] • [Dewhurst03] §33, §89 • [Sutter00] §36 • [Meyers96] §3

Список литературы

Примечание: для удобства читателей весь список литературы доступен по адресу http://www.gotw.ca/publications/c++cs/bibliography.htm

Ссылки, выделенные полужирным шрифтом (например, [Abrahams96]), представляют собой гиперссылки в приведенной выше странице.

[Abelson96] Abelson H. and Sussman G. J. Structure and Interpretation of Computer Programs (2nd Edition) (MIT Press, 1996).

[Abrahams96] Abrahams D. Exception Safety in STLport. STLport website, 1996.

[Abrahams01a] Abrahams D. Exception Safety in Generic Components, in Jazayeri M., Loos R., Musser D. (eds.), Generic Programming: International Seminar on Generic Programming, Dagstuhl Castle, Germany, April/May 1998, Selected Papers. Lecture Notes in Computer Science 1766 (Springer, 2001).

[Abrahams01b] Abrahams D. Error and Exception Handling. [Boost] website, 2001.

[Alexandrescu00a] Alexandrescu A. Traits: The else-if-then of Types. С++ Report, 12(4), April 2000.

[Alexandrescu00b] Alexandrescu A. Traits on Steroids. С++ Report, 12(6), June 2000.

[Alexandrescu00c] Alexandrescu A. and Marginean P. Change the Way You Write Exception-Safe Code — Forever. C/C++ Users Journal, 18(12), December 2000.

[Alexandrescu01] Alexandrescu A. Modern С++ Design. Addison-Wesley, 2001.

Перевод: Александреску А. Современное проектирование на С++. Серия С++ In-Depth, т.3. — М.: Издательский дом "Вильямс", 2002.

[Alexandrescu01a] Alexandrescu A. A Policy-Based basic_string Implementation. C/C++ Users Journal, 19(6), June 2001.

[Alexandrescu02a] Alexandrescu A. Multithreading and the С++ Type System. InformIT website, February 2002.

[Alexandrescu02b] Alexandrescu A. "Discriminated Unions (I)," "... (II)," and "... (III)". C/C++ Users Journal, 20(4,6,8), April/June/August 2002.

[Alexandrescu03a] Alexandrescu A. Move Constructors. C/C++ Users Journal, 21(2), February 2003.

[Alexandrescu03b] Alexandrescu A. Assertions. C/C++ Users Journal, 21(4), April 2003.

[Alexandrescu03c] Alexandrescu A. and Marginean P. Enforcements. C/C++ Users Journal, 21(6), June 2003.

[Alexandrescu03d] Alexandrescu A. and Held D. Smart Pointers Reloaded. C/C++ Users Journal, 21(10), October 2003.

[Alexandrescu04] Alexandrescu A. Lock-Free Data Structures. C/C++ Users Journal, 22(10), October 2004.

[Allison98] Allison С. С & С++ Code Capsules. Prentice Hall, 1998.

[Austern99] Austern M. H. Generic Programming and the STL. Addison-Wesley, 1999.

[Barton94] Barton J. and Nackman L. Scientific and Engineering С++. Addison-Wesley, 1994.

[Bentley00] Bentley J. Programming Pearls (2nd Edition). Addison-Wesley, 2000.

Перевод: Бентли Дж. Жемчужины программирования. Второе издание. — СПб.: Питер, 2002.

[BetterSCM] Web-узел Better SCM Initiative.

[Boost] С++ Boost.

[BoostLRG] Boost Library Requirements and Guidelines. (Web-узел Boost).

[Brooks95] Brooks F. The Mythical Man-Month. Addison-Wesley, 1975; reprinted with corrections in 1995.

[Butenhof97] Butenhof D. Programming with POSIX Threads. Addison-Wesley, 1997.

[Cargill92] Cargill T. С++ Programming Style. Addison-Wesley, 1992.

[C90] ISO/IEC 9899:1990(E), Programming Languages — C (ISO C90 and ANSI C89 Standard).

[C99] ISO/IEC 9899:1999(E), Programming Languages — C (revised ISO and ANSI C99 Standard).

[C++98] ISO/IEC 14882:1998(E), Programming Languages — С++ (ISO and ANSI С++ Standard).

[C++03] ISO/IEC 14882:2003(E), Programming Languages — С++ (updated ISO and ANSI С++ Standard including the contents of [C++98] plus errata corrections).

[C++TR104] ISO/IEC JTC1/SC22/WG21/N1711. (Draft) Technical Report on Standard Library Extensions (ISO С++ committee working document, November 2004). Близкий к окончанию черновик с расширениями стандартной библиотеки С++, включая shared_ptr.

[Cline99] Cline М., Lomow G., and Girou M. С++ FAQs (2nd Edition). Addison-Wesley, 1999.

[Constantine95] Constantine L. Constantine on Peopleware. Yourdon Press, 1995.

[Coplien92] Coplien J. Advanced С++ Programming Styles and Idioms. Addison-Wesley, 1992.

[Cormen01] Cormen T., Leiserson C., Rivest R., Stein C. Introduction to Algorithms (2nd Edition). MIT Press, 2001.

Перевод: Кормен T., Лейзерсон Ч., Ривест Р., Стейн К. Введение в алгоритмы. 2-е изд. — М.: Издательский дом "Вильямс" (в печати)

[CVS] Web-узел CVS.

[Cowan01] Cowan С., Barringer М., Beattie S., and Kroah-Hartman G. FormatGuard: Automatic Protection From printf Format String Vulnerabilities. Proceedings of the 2001 USENIX Security Symposium, August 2001, Washington, D.C.

[Dewhurst03] Dewhurst S. С++ Gotchas. Addison-Wesley, 2003.

[Dinkumware-Safe] Dinkumware Unabridged Library documentation (Web-узел Dinkumware).

[Ellis90] Ellis M. and Stroustrup B. The Annotated С++ Reference Manual. Addison-Wesley, 1990.

Перевод: Эллис M., Страуструп Б. Справочное руководство по языку программирования С++ с комментариями. — М.: Мир, 1992.

[Gamma95] Gamma E., Helm R., Johnson R., and Vlissides J. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995.

Перевод: Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. — СПб.: Питер, 2001.

[GnuMake] Gnu make (Web-узел Gnu).

[GotW] Sutter H. Guru of the Week column.

[Henney00] Henney K. С++ Patterns: Executing Around Sequences (EuroPLoP 2000 proceedings).

[Henney01] Henney K. С++ Patterns: Reference Accounting (EuroPLoP 2001 proceedings).

[Henney02a] Henney K. Stringing Things Along. Application Development Advisor, July-August 2002.

[Henney02b] Henney K. The Next Best String. Application Development Advisor, October 2002.

[Henricson97] Henricson M. and Nyquist E. Industrial Strength С++. Prentice Hall, 1997.

[Horstmann95] Horstmann C. S. Safe STL., 1995.

[Josuttis99] Josuttis N. The С++ Standard Library. Addison-Wesley, 1999.

Перевод: Джосьютис Н. С++. Стандартная библиотека. — СПб.: Питер (в печати).

[Keffer95] Keffer T. Rogue Wave С++ Design, Implementation, and Style Guide. Rogue Wave Software, 1995.

[Kernighan99] Kernighan B. and Pike R. The Practice of Programming. Addison-Wesley, 1999.

[Knuth89] Knuth D. The Errors of TeX. Software — Practice & Experience, 19(7), July 1989.

[Knuth97a] Knuth D. The Art of Computer Programming, Volume I: Fundamental Algorithms, 3rd Edition. Addison-Wesley, 1997.

Перевод: Кнут Д. Искусство программирования, том 1. Основные алгоритмы, 3-е изд. — М.: Издательский дом "Вильямс", 2000.

[Knuth97b] Knuth D. The Art of Computer Programming, Volume 2: Seminumerical Algorithms, 3rd Edition. Addison-Wesley, 1997.

Перевод: Кнут Д. Искусство программирования, том 2. Получисленные алгоритмы, 3-е изд. — М.: Издательский дом "Вильямс", 2000.

[Knuth98] Knuth D. The Art of Computer Programming, Volume 3: Sorting and Searching, 2nd Edition. Addison-Wesley, 1998.

Перевод: Кнут Д. Искусство программирования, том 3. Сортировка и поиск, 2-е изд. — М.: Издательский дом "Вильямс", 2000.

[Koenig97] Koenig A. and Moo В. Ruminations on С++. Addison-Wesley, 1997.

[Lakos96] Lakos J. Large-Scale С++ Software Design. Addison-Wesley, 1996.

[Liskov88] Liskov B. Data Abstraction and Hierarchy. SIGPLAN Notices, 23(5), May 1988.

[Martin96a] Martin R. C. The Dependency Inversion Principle. С++ Report, 8(5), May 1996.

[Martin96b] Martin R. C. Granularity. С++ Report, 8(9), October 1996.

[Martin96c] Martin R. C. The Open-Closed Principle. С++ Report, 8(1), January 1996.

[Martin98] Martin R. C., Riehle D., Buschmann F. (eds.). Pattern Languages of Program Design 3. Addison-Wesley, 1998.

[Martin00] Martin R. C. Abstract Classes and Pure Virtual Functions in Martin R. C. (ed.), More С++ Gems. Cambridge University Press, 2000.

[McConnell93] McConnell S. Code Complete. Microsoft Press, 1993.

[Metrowerks] Metrowerks.

[Meyer00] Meyer B. Object-Oriented Software Construction, 2nd Edition. Prentice Hall, 2000.

[Meyers96] Meyers S. More Effective С++. Addison-Wesley, 1996.

Перевод: Мейерс С. Наиболее эффективное использование С++. 35 новых рекомендаций по улучшению ваших программ и проектов. — М.: ДМК Пресс, 2000.

[Meyers97] Meyers S. Effective С++, 2nd Edition. Addison-Wesley, 1997.

Перевод: Мейерс С. Эффективное использование С++. 50 рекомендаций по улучшению ваших программ и проектов. — М.: ДМК Пресс, 2000.

1 ... 54 55 56 57 58 ... 62 ВПЕРЕД
Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Герб Саттер - Стандарты программирования на С++. 101 правило и рекомендация, относящееся к жанру Программирование. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)