Сейчас на сайте

Сейчас 3 гостей онлайн
Устоявшиеся соглашения PDF Печать E-mail
Автор: Administrator   
07.01.2010 16:05

Прежние объектно-ориентированные языки не пользовались особой популярностью из-за проблем с эффективностью. Так как C++ разрабатывался, в частности, для разрешения этих проблем, в него было включено множество деталей, позволяющих писать более эффективный код. Инициализация конструктора Рассмотрим мой пример буфера. Резонно представить, что вы захотите задавать размер при создании буфера. Один из способов реализовать это - добавить _новую функцию-член, позволяющую производить изменения размера буфера после создания объекта. Это снизило бы эффективность, поэтому C++ и здесь приходит вам на помощь и разрешает применять несколько конструкторов. B моем примере буфера я, вероятно, задал бы и стандартный конструктор (default constructor) - тот, который не принимает аргументов: Buffer() { _data = new char [256]; } и другой конструктор, который примает аргумент: Buffer(int i) { _data = new char [i]; } Теперь у меня есть два способа создания нового буфера. Как и раньше, я могу создать стандартный буфер либо в стеке, либо в динамической памяти:

A могу создать особый буфер, указав размер:

Хотя это выглядит слегка похожим на вызов функции, в действительности это особый способ инициализации переменной. Используя данную запись, вы можете так же инициализировать встроенные типы: int i=3; // Инициализация по-старому. int j(4); // Инициализация по-новому. Новый способ инициализации в некоторых случаях имеет небольшое преимущество в эффективности. (Если вы используете старый способ, некоторые компиляторы создают временный объект, затем копируют его в переменную, а затем удаляют временный объект; при использовании новой записи всегда происходит инициализация объекта непосредственно в переменной.)

Использование

Обычно вы ссылаетесь на функцию-член, начиная запись с имени объекта. Иногда, однако, вам требуется явно указать, какому классу принадлежит нужная функциячлен. Это происходит при определении функций, о котором я расскажу чуть позднее, и в том случае, если вам необходимо временно обойти обычные правила наследования. Наряду с записью object.Foo() или objectPointer->Foo() вы можете использовать запись Class::Foo() или даже object.Class::Foo(), хотя последняя форма несколько необычна. Типичный пример подобного использования представлен в главе 21, в определении PlayNote::SamplingRate (то есть, член SamplingRate класса PlayNote). B этом случае класс PlayNote хочет не замещать, а расширить определение AudioAbstract::SamplingRate. Он реализует подобный подход, сначала вызывая родительскую версию, а затем проводя любую дополнительную обработку.

Обновлено 07.01.2010 16:09
 

Поиск

Войти



Курсы валют