Содержание
- 2. Проблема Внутри описания класса инициализировать нельзя по синтаксису структуры, но и вне класса записать s.len =
- 3. Выход Инициализацию должна выполнять специальная член-функция класса.
- 4. Конструктор! Определение. Член-функция класса, предназначенная для инициализации член-данных класса при определении объектов класса, называется конструктором. Конструктор
- 5. Конструктор в классе String Объявление : String(); Определение конструктора: String:: String() { len = 0; line[0]
- 6. Конструктор в классе String Конструктор , и выполняет инициализацию объектов Так как конструктор не имеет аргументов,
- 7. Несколько конструкторов String:: String(const char * s) (2) { for( len = 0; line[len] != ‘\0’;
- 8. Заметим, что в классе должен быть один конструктор по умолчанию и один или несколько с аргументами.
- 9. Особенности конструктора, как функции: 1. Главная - конструктор не имеет возвращаемого значения (даже void), так как
- 10. Недостаток определенного класса String это то, что он берет для каждого объекта 259 байтов памяти, хотя
- 11. Другие конструкторы В классе объявим 2 конструктора String(int l = 80); //с аргументом по // умолчанию
- 12. String:: String(int l) // l=80 – не повторять! (3) {line = new char [l]; len=0; line[0]=’\0’;
- 13. Пример использования String s1(10), s2, s3(“без слов”); конструктор (3) аргумент задан l=10 конструктор (3) аргумент по
- 14. Замечание В классе должен быть или конструктор по умолчанию без аргументов вида (1), или конструктор с
- 15. Инициализация значением другой переменной В С++ кроме инициализации константным значением int x = 5; ... x++;
- 16. В классе String подобная инициализация может привести к ошибкам. String s(“паровоз”); ... String r = s;
- 17. Разберемся, почему это происходит При определении объекта String s(“паровоз”); работает конструктор, String::String(const char * s) (2’)
- 18. При определении объекта r String r = s; // или String r(s); компилятор просто выполняет копирование
- 19. Что неграмотно и недопустимо !
- 20. Поэтому для инициализации одного объекта другим надо определить специальный конструктор копирования X :: X( X& );
- 21. Тогда инициализация String r = s; выполнится грамотно. s: п а р о в о з
- 22. Все верно s.Print(); // выведет ‘паровоз’ r.Print(); // выведет ‘пароход’
- 23. Замечание Конструктор копирования кроме рассмотренной инициализации работает также при передаче значений фактических аргументов-объектов в функцию при
- 24. п 3.3. Деструктор В языке С++ одним из важных моментов является освобождение памяти, занятой переменными, при
- 25. При выходе из функции освобождается память для локальных объектов, т.е. k, s1,s2, s3. Но рассмотрим внимательнее,
- 26. Для того, чтобы при выходе из функций динамическая память, которая берется конструкторами объектов, освобождалась автоматически, надо
- 27. Деструктор Определение. Деструктор - это член функция класса, предназначенная для освобождения динамической памяти, занимаемой член-данными класса,
- 28. Пример Для класса String его можно определить таким образом ~ String() {delete [ ] line;}
- 29. Пример В этом случае при выходе из области видимости функции F() память для объектов s1, s2,
- 30. k: 0 s1: line len \0 ... Пустая строка из 20 байтов s2: 4 line len
- 31. Особенности деструктора как функции: он не имеет аргументов; он не возвращает значения; работает неявно для всех
- 32. class String {char *line; int len; public: String(int l=80); // конструктор по умолчанию String(const char *);
- 33. char & Index (int) char & String:: Index (int i) { if(i =len) cout return line[i];
- 35. Скачать презентацию