Подбор материала и презентация: Сазонов Д.О. Кафедра ПМиЭММ ВГТА Динамические объекты, ссылки
Адресация в С++ Ячейки памяти нумеруются в компьютере последовательно: 1, 2, 3, 4 и т.д. Эти числа называются адресами ячеек памяти ….. 0x00x10x9B380x9B390x9B3A0x9B3B0x9B3C0xFFFF0xFFFE ….. 0x00x10x9B380x9B390x9B3A0x9B3B0x9B3C0xFFFF0xFFFE Блок 1 Блок N XXXXXX Рассмотрим случай, когда создается новая динамическая переменная. После запуска программы некоторые ячейки памяти сразу же становятся занятыми - в них помещается код, данные, стек и т.д. XXXXXXXXX int main(int argc, char* argv[]) { int *test; test=new int; *test=3; cout
Адресация в С++ Итак, значение указателя test (cout
Это объект test Вспомним, что такое объект и представим как он располагается в памяти class samp { int a; public: samp() { a =10 ; } int get_a() { return a; } } test; ….. 0x00x1 0x9B38 0x9AC Функция samp()Функция get_a() a 0x9AB Обращение к членам класса в случае НЕ ДИНАМИЧЕСКОГО объекта происходит следующим образом... test.a test.samp() test.get_a()
Обращение к членам класса в случае ДИНАМИЧЕСКОГО объекта происходит немного по другому Это класс test 0x9B38 0x9AC Функция samp()Функция get_a() a 0x9AB ….. 0x00x1 ….. 0x01020x01030x01040x0C020x0C030x0C04 ….. XXXX Динамический объект test Ссылается на область памяти, в которой записан адрес по которому находится класс 0x9b38
Это класс test 0x9B38 0x9AC Функция samp()Функция get_a() a 0x9AB ….. 0x00x1 ….. 0x0102 0x01030x01040x0C020x0C030x0C04 ….. XXXX 0x9b38 Адрес объекта test К членам класса теперь необходимо обращаться через стрелку... test->a test->samp() test-> get_a() Преимущество данного метода очевидно при использовании нескольких объектов. Для смены объекта нам не надо переписывать программу, достаточно заменить адрес хранения старого объекта на адрес хранения нового. Можно перебирать объекта через массив и многое другое о чем мы поговорим чуть попозже. Это класс test 0x9B38 0x9AC Функция samp()Функция get_a() a 0x9AB Это класс test 0x9B38 0x9AC Функция samp()Функция get_a() a 0x9AB
#include "stdafx.h" #include "iostream.h" int main() { int *p; p = new int(9); // задание начального значения равного 9 if(!p) { cout
#include "stdafx.h" #include "iostream.h" class samp { int i, j; public: samp(int a, int b) { i = a; j = b; } int get_product() { return i*j; } }; int main() { samp *p; p = new samp(6, 5); // размещение объекта с инициализацией if(!p) { cout
Рассмотрим пример: 1 class samp { 2 int a, b; 3 public: 4 samp(int n, int m) 5 { a = n; b = m; } 6 int get_a() { return a; } 7 int get_b() { return b; } 8 }; 9 int main() 10 { 11 samp ob[4] = { 12 samp(1, 2), 13 samp(3, 4), 14 samp(5, 6), 15 samp(7, 8) 16 }; 17 int i; 18 samp *p; // получение адреса начала массива 19 p = ob; 20 for(i=0; i
#include "stdafx.h" #include "iostream.h" class samp { int a, b; public: samp(int n, int m) { a = n; b = m; } int get_a() { return a; } int get_b() { return b; } }; int main() { samp ob[4] = { samp(1, 2), samp(3, 4), samp(5, 6), samp(7, 8) }; int i; samp *p; p = ob; // получение адреса начала массива for(i=0; i
Использование указателя this (Сравните следующие две программы) #include "stdafx.h" #include "iostream.h" #include "string.h" class inventory { char item[20]; double cost; int on_hand; public: inventory(char *i, double c, int o) { strcpy(this->item, i); // доступ к члену this->cost = c; // через this->on_hand = o; // указатель this } void show(); }; void inventory::show() { cout item; // использование this для доступа к членам cout cost; cout on_hand
Динамическое выделение памяти для массива объектов #include "stdafx.h" #include "iostream.h" class samp { int i, j; public: void set_ij(int a, int b) { i = a; j = b; } ~samp() { cout
Внимание! На следующее занятие будет контрольная работа! Повторить создание объектов, наследование, полиморфизм, указатели, ну и само собой синтаксис языка С++ Небольшое полезное замечание: Для печати русскими буквами в консольном приложении используйте следующий код: #include "windows.h" void print(char *s) { char dest[200]; char src[200]; strcpy(src,s); CharToOem(src,dest); cout