
- •5)Указатели и ссылки.
- •12) Параметры структурных типов.
- •13) Классы памяти переменных.
- •14) Параметры-функции.
- •15) Правила, определяющие видимость переменных в функциях.
- •16) Пространства имен.
- •Int Pages;
- •Int getPages(); // тело будет описано в book.Сpp
- •18) Перегрузка функций.
- •19) Функции с параметрами по умолчанию.
- •20) Текстовые файлы. Отличие от Delphi Pascal.
- •Int fscanf(file *stream,const char *format[,adress,...]);
- •Int fprintf(file *stream,const char *format[,argument,...]);
- •21) Двоичные файлы. Отличие от Delphi Pascal.
- •22) Определение класса, компоненты класса. Ограничение доступа.
- •23) Инициализация полей при отсутствии конструктора.
- •24) Конструкторы. Инициализация полей при наличии конструктора.
- •25) Деструкторы.
- •27) Простое и множественное наследование классов.
- •28) Наследование. Ограничение доступа при наследовании.
- •29) Конструкторы и деструкторы производных классов.
- •30) Композиция.
- •31)Наполнение
- •32) Полиморфное наследование. Простой полиморфизм.
- •33) Полиморфное наследование. Сложный полиморфизм.
- •34) Статические компоненты классов.
- •35) Особенности работы с динамическими объектами.
- •36) Объекты с динамическими полями. Копирующий конструктор.
- •Void Print(tPoint r) {…}
- •37) Дружественные функции, методы и классы.
- •38) Переопределение операций.
- •39) Шаблоны классов.
- •40) Шаблоны функций.
- •46) Сигналы, слоты и события Qt.
23) Инициализация полей при отсутствии конструктора.
class СBook{
public: char Name[30];
int Pages;
char *getName() { // метод по умолчанию inline, так
return Name; // как его тело описано в классе
}
int getPages(); // тело будет описано в book.сpp
};
void main()
{ СBook A = {"J.London. V.1",366};
СBook C[]= {{"J.London. V.3",367},
{"J.London. V.4",321},
{"J.London. V.5",356}};
... }
24) Конструкторы. Инициализация полей при наличии конструктора.
Конструктор – метод, автоматически вызываемый при выделении памяти под объект. Используется для инициализации полей объекта. Автоматический вызов страхует от ошибки оставить поля неинициализированными.
class CBook
{protected: char Name[30];
int Pages;
public:
CBook(char *name,int pages) {
Pages=pages; strcpy(Name,name);
}…
При создании объектов классов с конструкторами параметры записываются в круглых скобках:
void main()
{ CBook D("J.London. Smoke Bellew",267);
Конструкторы, как и другие функции, можно перегружать. Специальный конструктор без параметров (инициализирующий или пустой) используется для создания объектов, которым при выделении памяти не могут быть переданы значения полей.
а) CBook(){} // неинициализирующий конструктор без параметров, используется для создания неинициализированных объектов
б) CBook(){ Name[0]='\0'; Pages=0; } // инициализирующий конструктор без параметров, создает однотипно инициализированные объекты
При создании объектов посредством конструкторов без параметров круглые скобки не указывают:
25) Деструкторы.
Деструкторы аналогично конструкторам вызываются автоматически, но в момент освобождения памяти, выделенной под объект. Деструкторы обычно используют для освобождения памяти, выделенной под динамические поля объектов.
26) Инициализация полей объектов при наличии и отсутствии конструктора.
В программе, использующей классы, по мере необходимости объявляют объекты этих классов.
Объекты – переменные программы, соответственно на них распространяются общие правила длительности существования и области действия переменных, а именно:
· внешние, статические и внешние статические объекты создаются до вызова функции main() и уничтожаются по завершении программы;
· автоматические объекты создаются каждый раз при вызове функции, в которой они объявлены, и уничтожаются при выходе из нее;
· объекты, память под которые выделяется динамически, создаются оператором new и уничтожаются оператором delete.
При объявлении полей в описании класса не допускается их инициализация, поскольку в момент описания класса память для размещения его полей еще не выделена.
Выделение памяти осуществляется не для класса, а для объектов этого класса, поэтому возможность инициализации полей появляется только во время или после объявления
объекта конкретного класса.
Объявление объектов и способы инициализации их полей зависят от наличия или отсутствия в классе специального инициализирующего метода – конструктора, а также от того, в какой секции класса описано инициализируемое поле.
Если в классе отсутствует конструктор, но описаны защищенные protected или скрытые private поля, то возможно создание только неинициализированных объектов.
Для этого используется стандартная конструкция объявления переменных или указателей на них. Например:
First a, // объект класса First
*b, // указатель на объект класса First
c[4]; // массив с из четырех объектов класса First
При объявлении указателя, как и для обычных переменных, память под объект не выделяется. Это необходимо сделать отдельно, используя операцию new, после работы с динамическим объектом память необходимо освободить:
b=new First; ... delete b;
Объект, созданный таким способом, называют динамическим.
Значения полей неинициализированных статических и динамических объектов или массивов объектов задают в процессе дальнейшей работы с объектами: защищенных и скрытых – только в методах класса, а общедоступных – в методах класса или непосредственным присваиванием в программе.
При отсутствии в классе конструктора и защищенных protected или скрытых private полей для объявления инициализированных объектов используют оператор инициализации, применяемый при создании инициализированных структур, например:
First a = {'A',3,4},
c[4] = {{'A',1,4},{'B',3,5},{'C',2,6},{'D',1,3}};
Инициализирующие значения при этом должны перечисляться в порядке следования полей в описании класса.
Обращение к общедоступным полям и методам объекта из программы.
Обращение к общедоступным полям и методам объекта из программы может осуществляться с помощью полных имен, каждое из которых имеет вид
<Имя объекта> . <Имя класса> :: <Имя поля или функции> ;
Например:
a.First::set('A',3,4); // статический объект
b->First::set('B',3,4); // динамический объект
c[i].First::set('C',3,4); // массив объектов
Однако обычно доступ к компонентам объекта обеспечивается с помощью укороченного имени, в котором квалификатор доступа опущен, тогда принадлежность к классу определяется по типу объекта:
<Имя объекта>.<Имя поля или функции>
<Имя указателя на объект> -> <Имя поля или функции>
<Имя объекта>[<Индекс>].<Имя поля или функции>
Например:
а.x b->x c[i].x
a.set('A',3,4) b->set('B',3,4) c[i].set('C',3,4)
Первая строка демонстрирует обращение к общедоступным полям простого объекта, динамического объекта и элемента массива объектов. Вторая строка – обращение к общедоступным методам соответствующих объектов.
Конструктор – метод класса, который а в т о м а т и ч е с к и вызывается при выделении памяти под объект.
По правилам С++ конструктор имеет то же имя, что и класс, не наследуется в производных классах, может иметь аргументы, но не возвращает значения, может быть параметрически перегружен.
class Num
{
int n;
public:
Num(int an){ cout<<"Конструктор"<<endl; n=an; }