- •11. Базы данных, определение, типы бд. Понятие домена, атрибута,
- •32. История создания эвм. Поколения и классы эвм. Структура
- •46. Общая характеристика операционной системы Linux. Основные
- •67. Понятие нормальной формы отношений. Условия нахождения бд
- •1.3D моделирование в компьютерной графике
- •2. Case-средства. Работа с case-средством Erwin. Логическая и
- •4. Алгоритм декомпозиции отношения с целью его нормализации.
- •7. Архивирование данных. Преимущества и недостатки современных
- •12. Баухауз и его вклад в развитие мирового дизайна.
- •13. Бизнес - цели и жизненный цикл изделия
- •15. Василий Кандинский – теория цвета. Психология цвета.
- •16. Векторная и растровая графика, основные понятия, области
- •18. Виды обеспечения систем компьютерной графики.
- •21. Единый формат векторной графики.
- •Пример использования tadoConnection
- •Пример использования параметров запроса
- •Синхронизация данных клиента и сервера.
- •Работа с транзакциями
- •Пример работы с транзакциями
- •Доступ к данным
- •Пример работы с отложенными изменениями.
- •Cals-идеология
- •Cals-технологии
- •Cals-системы
- •Плюсы и минусы
- •28. Использование векторной и растровой графики в web.
- •30. Использование международных стандартов.
- •34. Конструктивизм в художественном дизайне.
- •35. Кривая Безье, ее построение и редактирование.
- •13.1. Определение класса
- •13.1.1. Данные-члены
- •13.1.2. Функции-члены
- •13.1.5. Объявление и определение класса
- •13.2. Объекты классов
- •13.4. Неявный указатель this
- •13.4.1. Когда использовать указатель this
- •38. Мастера модерна. А. Ванде Вельде, ч. Р. Макинтош.
- •43. Обеспечение информационной безопасности.
- •44. Области применения компьютерной графики.
- •48. Оптические устройства хранения информации. Виды и основные
- •50. Основные принципы cals.
- •52. Основные структурные элементы эвм (материнские платы,
- •Основные характеристики шрифтов
- •Художественный облик шрифтов
- •55. Основы композиции в промышленном дизайне. Категории
- •Оператор break
- •Оператор return
- •60. П. Беренс – первый промышленный дизайнер.
- •61. Параллельное и последовательное моделирование
- •62. Параметризация в компьютерной графике.
- •63. Первые теории дизайна Дж. Рескин, г. Земпер, ф. Рело.
- •65. Понятие ключа, первичного ключа, индекса.
- •Первая нормальная форма (1nf)
- •Вторая нормальная форма (2nf)
- •Третья нормальная форма (3nf)
- •Методы решения
- •Процедура принятия решений
- •4. Отчеты - позволяют обобщать и распечатывать информацию. Создание базы данных
- •Создание формы
- •Вызовы sql в pl/sql-ном блоке
- •Вызовы sql в pl/sql-ном блоке
- •См. Вопрос 122 fat32. Чем она лучше fat16?
- •Оттенки фиолетового
- •Оттенки синего
- •Оттенки зеленого
- •Оттенки желтого
- •Цветовая гармония
- •Восприятие цвета
- •Различие между цветами Различные источники света
- •Различная ориентация
- •Различия в восприятии размера
13.4.1. Когда использовать указатель this
Наша функция main() вызывает функции-члены класса Screen для объектов myScreen и bufScreen таким образом, что каждое действие – это отдельная инструкция. У нас есть возможность определить функции-члены так, чтобы конкатенировать их вызовы при обращении к одному и тому же объекту. Например, все вызовы внутри main() будут выглядеть так:
int main() {
// ...
myScreen.clear().move( 2, 2 ), set( '*' ). display();
bufScreen.reSize( 5, 5 ).display();
}
Именно так интуитивно представляется последовательность операций с экраном: очистить экран myScreen, переместить курсор в позицию (2,2), записать в эту позицию символ '*' и вывести результат.
Операторы доступа "точка" и "стрелка" левоассоциативны, т.е. их последовательность выполняется слева направо. Например, сначала вызывается myScreen.clear(), затем myScreen.move() и т.д. Чтобы myScreen.move() можно было вызвать после myScreen.clear(), функция clear() должна возвращать объект myScreen, для которого она была вызвана. Мы уже видели, что доступ к объекту внутри функции-члена класса производится в помощью указателя this. Вот реализация clear():
// объявление clear() находится в теле класса
// в нем задан аргумент по умолчанию bkground = '#'
Screen& Screen::clear( char bkground )
{ // установить курсор в левый верхний угол и очистить экран
_cursor = 0;
_screen.assign( // записать в строку
_screen.size(), // size() символов
bkground // со значением bkground
);
// вернуть объект, для которого была вызвана функция
return *this;
}
Обратите внимание, что возвращаемый тип этой функции-члена – Screen& – ссылка на объект ее же класса. Чтобы конкатенировать вызовы, необходимо также пересмотреть реализацию move() и set(). Возвращаемый тип следует изменить с void на Screen&, а в определении возвращать *this.
Аналогично функцию-член display() можно написать так:
Screen& Screen::display()
{
typedef string::size_type idx_type;
for ( idx_type ix = 0; ix < _height; ++ix )
{ // для каждой строки
idx_type offset = _width * ix; // смещение строки
for ( idx_type iy = 0; iy < _width; ++iy )
// для каждой колонки вывести элемент
cout << _screen[ offset + iy ];
cout << endl;
}
return *this;
}
А вот реализация reSize():
// объявление reSize() находится в теле класса
// в нем задан аргумент по умолчанию bkground = '#'
Screen& Screen::reSize( int h, int w, char bkground )
{ // сделать высоту экрана равной h, а ширину - равной w
// запомнить содержимое экрана
string local(_screen);
// заменить строку _screen
_screen.assign( // записать в строку
h * w, // h * w символов
bkground // со значением bkground
);
typedef string::size_type idx_type;
idx_type local_pos = 0;
// скопировать содержимое старого экрана в новый
for ( idx_type ix = 0; ix < _height; ++ix )
{ // для каждой строки
idx_type offset = w * ix; // смещение строки
for ( idx_type iy = 0; iy < _width; ++iy )
// для каждой колонки присвоить новое значение
_screen[ offset + iy ] = local[ local_pos++ ];
}
_height = h;
_width = w;
// _cursor не меняется
return *this;
}
Работа указателя this не исчерпывается возвратом объекта, к которому была применена функция-член. При рассмотрении copy() в разделе 13.3 мы видели и другой способ его использования:
void Screen::copy( const Screen& sobj )
{
// если этот объект Screen и sobj - одно и то же,
// копирование излишне
if ( this != sobj )
{
// скопировать значение sobj в this
}
}
Указатель this хранит адрес объекта, для которого была вызвана функция-член. Если адрес, на который ссылается sobj, совпадает со значением this, то sobj и this относятся к одному и тому же объекту, так что операция копирования не нужна. (Мы еще встретимся с этой конструкцией, когда будем рассматривать копирующий оператор присваивания в разделе 14.7.)
Упражнение 13.7
Указатель this можно использовать для модификации адресуемого объекта, а также для его замены другим объектом того же типа. Например, функция-член assign() класса classType выглядит так. Можете ли вы объяснить, что она делает?
classType& classType::assign( const classType &source )
{
if ( this != &source )
{
this->~classType();
new (this) classType( source );
}
return *this;
}
Напомним, что ~classType – это имя деструктора. Оператор new выглядит несколько причудливо, но мы уже встречались с подобным в разделе 8.4.
