🗊Презентация Конструкторы.Деструктор

Категория: Образование
Нажмите для полного просмотра!
/ 34

Содержание

Вы можете ознакомиться и скачать презентацию на тему Конструкторы.Деструктор . Доклад-сообщение содержит 34 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Назначение конструктора
Описание слайда:
Назначение конструктора

Слайд 2





Проблема
Внутри описания класса инициализировать
нельзя по синтаксису структуры, 
но и вне класса записать
s.len = 0; s.line[0] = ’\0’;
тоже нельзя, т.к. член-данные из части private
недоступны. 
( Заметим, что если определить их в части public, то их
можно инициализировать как структуру, т.е.
String s = {“”, 0}; )
Описание слайда:
Проблема Внутри описания класса инициализировать нельзя по синтаксису структуры, но и вне класса записать s.len = 0; s.line[0] = ’\0’; тоже нельзя, т.к. член-данные из части private недоступны. ( Заметим, что если определить их в части public, то их можно инициализировать как структуру, т.е. String s = {“”, 0}; )

Слайд 3





Выход
Инициализацию  должна выполнять
специальная член-функция класса.
Описание слайда:
Выход Инициализацию должна выполнять специальная член-функция класса.

Слайд 4





Конструктор!
Определение. Член-функция класса,
предназначенная для инициализации
член-данных класса при определении
объектов класса, называется
конструктором. 
Конструктор всегда имеет имя
класса.
Описание слайда:
Конструктор! Определение. Член-функция класса, предназначенная для инициализации член-данных класса при определении объектов класса, называется конструктором. Конструктор всегда имеет имя класса.

Слайд 5





Конструктор в классе String
Объявление :
 String();
Определение конструктора: 
String:: String()  { len = 0; line[0] = ’\0’;}              (1)
Определение объектов: 
String s1, s2; 
.
Описание слайда:
Конструктор в классе String Объявление : String(); Определение конструктора: String:: String() { len = 0; line[0] = ’\0’;} (1) Определение объектов: String s1, s2; .

Слайд 6





Конструктор в классе String
Конструктор                                                 , 
и выполняет инициализацию объектов
Так как конструктор не имеет аргументов, то он
называется конструктором по умолчанию.
Описание слайда:
Конструктор в классе String Конструктор , и выполняет инициализацию объектов Так как конструктор не имеет аргументов, то он называется конструктором по умолчанию.

Слайд 7





Несколько конструкторов
String:: String(const char * s)                                     (2)
{ for( len = 0; line[len] != ‘\0’; len++)
 				line[len] = s[len]; 
}
Тогда объекты можно определить таким образом
String s1, s2(“Иванов”), s3 = String(“Петров”);
Для объекта s3 конструктор задается явно(но так
конструктор используется редко)
Описание слайда:
Несколько конструкторов String:: String(const char * s) (2) { for( len = 0; line[len] != ‘\0’; len++) line[len] = s[len]; } Тогда объекты можно определить таким образом String s1, s2(“Иванов”), s3 = String(“Петров”); Для объекта s3 конструктор задается явно(но так конструктор используется редко)

Слайд 8






Заметим, что в классе должен быть один
конструктор по умолчанию и один или
несколько с аргументами.
Описание слайда:
Заметим, что в классе должен быть один конструктор по умолчанию и один или несколько с аргументами.

Слайд 9





Особенности конструктора, как функции:
1. Главная - конструктор не имеет
возвращаемого значения (даже void), 
так как его единственное назначение –
инициализировать собственные член-
данные объекта;
2. Конструктор имеет имя класса;
3. Конструктор всегда работает неявно
при определении объектов класса
Описание слайда:
Особенности конструктора, как функции: 1. Главная - конструктор не имеет возвращаемого значения (даже void), так как его единственное назначение – инициализировать собственные член- данные объекта; 2. Конструктор имеет имя класса; 3. Конструктор всегда работает неявно при определении объектов класса

Слайд 10





Недостаток определенного класса String
это то, что он берет для каждого объекта 259 байтов памяти, хотя фактически использует меньше
class String{ char *line; int len;
                   public:
                    ....
                   };
Описание слайда:
Недостаток определенного класса String это то, что он берет для каждого объекта 259 байтов памяти, хотя фактически использует меньше class String{ char *line; int len; public: .... };

Слайд 11





Другие конструкторы
В классе объявим 2 конструктора
	String(int l = 80);    //с аргументом по 	                               	                         // умолчанию
   String (const char *); //с аргументом 	    	                             // строкой
Описание слайда:
Другие конструкторы В классе объявим 2 конструктора String(int l = 80); //с аргументом по // умолчанию String (const char *); //с аргументом // строкой

Слайд 12






String:: String(int l) // l=80 – не повторять! (3) 	
{line = new char [l]; len=0;
  line[0]=’\0’;
}
String::String(const char * s)                    (2’)
{line = new char [strlen(s)+1];// для нуль-кода
 for( len = 0; line[len] != ‘\0’; len++) 
		line[len] = s[len]; 
}
Описание слайда:
String:: String(int l) // l=80 – не повторять! (3) {line = new char [l]; len=0; line[0]=’\0’; } String::String(const char * s) (2’) {line = new char [strlen(s)+1];// для нуль-кода for( len = 0; line[len] != ‘\0’; len++) line[len] = s[len]; }

Слайд 13





Пример использования
Описание слайда:
Пример использования

Слайд 14





Замечание
В классе должен быть 
или конструктор по умолчанию без аргументов вида (1), 
или конструктор с аргументом по умолчанию вида (3)
 
String ss;
‘Ambiguity between ‘String::String()’ and
‘String::String(int)’ -
‘Двусмысленность между String() и String( int )’
Описание слайда:
Замечание В классе должен быть или конструктор по умолчанию без аргументов вида (1), или конструктор с аргументом по умолчанию вида (3) String ss; ‘Ambiguity between ‘String::String()’ and ‘String::String(int)’ - ‘Двусмысленность между String() и String( int )’

Слайд 15





Инициализация значением другой переменной
В С++  кроме инициализации константным
значением 
int x = 5;
...
x++;
...
используется  и такая инициализация данных
int y = x; // инициализация одного данного 	  	     // значением другого
Описание слайда:
Инициализация значением другой переменной В С++ кроме инициализации константным значением int x = 5; ... x++; ... используется и такая инициализация данных int y = x; // инициализация одного данного // значением другого

Слайд 16





В классе String подобная инициализация
В классе String подобная инициализация
может привести к ошибкам.
String s(“паровоз”);
...
String r = s; // определение объекта r и 
                   // инициализация его значением 	  	          // объекта s
r.Index(4) = ‘х’ ; r.Index(6) = ‘д’;// изменим на пароход
s.Print(); r.Print();
Увидим, что выведется пароход в обоих
случаях. Это плохо.
Описание слайда:
В классе String подобная инициализация В классе String подобная инициализация может привести к ошибкам. String s(“паровоз”); ... String r = s; // определение объекта r и // инициализация его значением // объекта s r.Index(4) = ‘х’ ; r.Index(6) = ‘д’;// изменим на пароход s.Print(); r.Print(); Увидим, что выведется пароход в обоих случаях. Это плохо.

Слайд 17





Разберемся, почему это происходит
Описание слайда:
Разберемся, почему это происходит

Слайд 18


 Конструкторы.Деструктор , слайд №18
Описание слайда:

Слайд 19





Что неграмотно и недопустимо !
Что неграмотно и недопустимо !
Описание слайда:
Что неграмотно и недопустимо ! Что неграмотно и недопустимо !

Слайд 20





Поэтому для инициализации одного объекта
Поэтому для инициализации одного объекта
другим надо определить специальный 
конструктор копирования
X :: X( X& );                          // где X - имя класса
String(String &);
String::String(String  &s)
{ line = new char[ s.len + 1 ];
  for( len = 0; line[len] != ‘\0’; len++)
 				line[len] = s.line[len]; 
 }
Описание слайда:
Поэтому для инициализации одного объекта Поэтому для инициализации одного объекта другим надо определить специальный конструктор копирования X :: X( X& ); // где X - имя класса String(String &); String::String(String &s) { line = new char[ s.len + 1 ]; for( len = 0; line[len] != ‘\0’; len++) line[len] = s.line[len]; }

Слайд 21





Тогда инициализация
String r = s;
выполнится грамотно.
Описание слайда:
Тогда инициализация String r = s; выполнится грамотно.

Слайд 22





Все  верно
s.Print();  // выведет ‘паровоз’
r.Print();  // выведет ‘пароход’
Описание слайда:
Все верно s.Print(); // выведет ‘паровоз’ r.Print(); // выведет ‘пароход’

Слайд 23





Замечание
Конструктор копирования кроме
рассмотренной инициализации работает
также 
при передаче значений фактических аргументов-объектов в функцию 
при возврате результата-объекта из функции.
Описание слайда:
Замечание Конструктор копирования кроме рассмотренной инициализации работает также при передаче значений фактических аргументов-объектов в функцию при возврате результата-объекта из функции.

Слайд 24





п 3.3. Деструктор
В языке С++ одним из важных моментов
является освобождение памяти, занятой
переменными, при выходе из функции.
void F()
Описание слайда:
п 3.3. Деструктор В языке С++ одним из важных моментов является освобождение памяти, занятой переменными, при выходе из функции. void F()

Слайд 25





При выходе из функции освобождается память
При выходе из функции освобождается память
для локальных объектов, т.е. k, s1,s2, s3.  Но
рассмотрим внимательнее, как это будет
реализовано.
Описание слайда:
При выходе из функции освобождается память При выходе из функции освобождается память для локальных объектов, т.е. k, s1,s2, s3. Но рассмотрим внимательнее, как это будет реализовано.

Слайд 26





Для того, чтобы при выходе из
Для того, чтобы при выходе из
функций динамическая память,
которая берется конструкторами
объектов, освобождалась
автоматически, надо задать
специальную член-функцию 
деструктор.
Описание слайда:
Для того, чтобы при выходе из Для того, чтобы при выходе из функций динамическая память, которая берется конструкторами объектов, освобождалась автоматически, надо задать специальную член-функцию деструктор.

Слайд 27





Деструктор
Определение. Деструктор - это член
функция класса, предназначенная для
освобождения динамической памяти,
занимаемой член-данными класса, при
выходе из функций. Деструктор имеет
формат
~ имя_класса(){…}
Описание слайда:
Деструктор Определение. Деструктор - это член функция класса, предназначенная для освобождения динамической памяти, занимаемой член-данными класса, при выходе из функций. Деструктор имеет формат ~ имя_класса(){…}

Слайд 28





Пример
Для класса String его можно определить
таким образом
~ String()    {delete [ ] line;}
Описание слайда:
Пример Для класса String его можно определить таким образом ~ String() {delete [ ] line;}

Слайд 29





Пример
В этом случае при выходе из области
видимости функции F() память для
объектов s1, s2, которую брал 
конструктор для поля line, будет
освобождена.
Заданный деструктор это будет делать по
умолчанию.
Описание слайда:
Пример В этом случае при выходе из области видимости функции F() память для объектов s1, s2, которую брал конструктор для поля line, будет освобождена. Заданный деструктор это будет делать по умолчанию.

Слайд 30


 Конструкторы.Деструктор , слайд №30
Описание слайда:

Слайд 31





Особенности деструктора как функции:

он не имеет аргументов;
он не возвращает значения;
работает неявно для всех объектов при выходе из функций
Замечание. Работу деструктора можно
“увидеть”, если в деструкторе задать какой-
либо вывод.
~String() 
    { printf(“\nРаботает деструктор класса String”);
 	delete [ ] line; }
Описание слайда:
Особенности деструктора как функции: он не имеет аргументов; он не возвращает значения; работает неявно для всех объектов при выходе из функций Замечание. Работу деструктора можно “увидеть”, если в деструкторе задать какой- либо вывод. ~String() { printf(“\nРаботает деструктор класса String”); delete [ ] line; }

Слайд 32





class String
class String
 {char *line; int len;
   public:
  String(int l=80); // конструктор по умолчанию
  String(const char *); //конструктор с аргументом
  String(String &);       // конструктор копирования
  ~String()  { delete [] line;} // деструктор
   void Print()  { cout << line;}
   int  Len() { return len;}
   char & Index( int );
   void Fill( const char* );
  };
Описание слайда:
class String class String {char *line; int len; public: String(int l=80); // конструктор по умолчанию String(const char *); //конструктор с аргументом String(String &); // конструктор копирования ~String() { delete [] line;} // деструктор void Print() { cout << line;} int Len() { return len;} char & Index( int ); void Fill( const char* ); };

Слайд 33





char & Index (int)
char & String::  Index (int i)
  { if(i<0 || i>=len)
     cout << ”\n Индекс за пределами “;  exit(0);}
    return line[i]; }
Тип возвращаемого значения char & - ссылка
возвращает не просто значение символа, а
ссылку на ячейку, где он находится.
Это и позволяет выполнить присвоение вида
r.Index (4) = ’х’;
Описание слайда:
char & Index (int) char & String:: Index (int i) { if(i<0 || i>=len) cout << ”\n Индекс за пределами “; exit(0);} return line[i]; } Тип возвращаемого значения char & - ссылка возвращает не просто значение символа, а ссылку на ячейку, где он находится. Это и позволяет выполнить присвоение вида r.Index (4) = ’х’;

Слайд 34





Возвращаемый тип char
Если определить тип  возвращаемого значения
просто char, то присвоение вида
r.Index (4) = ’х’;                                         (*)
было бы ошибочным, так как функция вернет
значение символа и компилятор будет
трактовать оператор (*), как присвоение одного
кода  символа другому коду, как в данном
примере
‘в’=’х’; 
что невозможно.
Описание слайда:
Возвращаемый тип char Если определить тип возвращаемого значения просто char, то присвоение вида r.Index (4) = ’х’; (*) было бы ошибочным, так как функция вернет значение символа и компилятор будет трактовать оператор (*), как присвоение одного кода символа другому коду, как в данном примере ‘в’=’х’; что невозможно.



Похожие презентации
Mypresentation.ru
Загрузить презентацию