Конструктор с параметрами.ppt
- Количество слайдов: 46
Конструктор с параметрами
• Конструктор с параметрами называется конструктор инициализации (initialized constructor) или основной конструктор. Конструктор инициализации будет иметь один параметр, который будет передаваться переменной id и эта переменная будет идентификатором объекта. Конструктор по умолчанию будет присваивать ей значение 0.
Рассмотрим пример, опять использую класс queue, немного его изменив: class queue { protected: int q[100]; int sloc, rloc; int id; // идентификатор объекта public: queue(void); // конструктор по умолчанию queue(int i); // конструктор инициализации ~queue(void); // деструктор void qput(int); // прототипы int qget(void); // функций };
Переменная id будет содержать значение параметра, идентифицирующего объект. Он будет определен при создании объекта типа queue. Перепишем конструктор по умолчанию в следующем виде: queue: : queue(void) { rloc=sloc=id=0; cout<<”n конструктор по умолчанию очереди queue ”<
Конструктор инициализации напишем в виде: queue: : queue(int i) { rloc=sloc=0; id=i; cout<<”n конструктор инициализации очереди queue ”<
• Для передачи значения параметра при объявлении объекта в С++ существует два способа: • Первый способ: • queue a=queue(101); • второй способ – более короткая форма: • queue a(101); • Общая форма передачи аргумента конструктора следующая: • class_type переменная (списокаргументов);
Пример Использования конструкторов с параметром и перегруженных конструкторов.
• • • • #include
• queue: : queue(void) • { • rloc=sloc=id=0; • cout<<"Конструктор по умолчанию очереди"<
• • • • queue: : ~queue(void) { cout<<"Очередь "<
• • • void queue: : qput(int i) { if (sloc==100) { cout<<"n Очередь полнаn"; return; } q[sloc++]=i; }
• • • • • void main(void) { queue a=queue(101), b(102), c; a. qput(10); b. qput(19); a. qput(20); b. qput(1); for(int i=0; i<3; i++) c. qput(200+i); cout<
Результат работы программы: • • Конструктор инициализации очереди 101 Конструктор инициализации очереди 102 Конструктор инициализации очереди 0 10 20 19 1 200 201 202 Очередь 0 разрушена Очередь 102 разрушена Очередь 101 разрушена
Конструктор может иметь несколько параметров разного типа • • • • #include
• • • void c 1: : show(void) { cout<<”i=”<
Конструктор копирования • Конструктор копирования (копии) является конструктором специального вида: он воспринимает в качестве аргумента константную ссылку на объект класса (const тип-класса&) или простую ссылку на объект (типкласса&)
Пример: • class Coord • { • int x, y; • public: • Coord(const Coord &src); // конструктор копирования • }; • Coord: : Coord(const Coord &src) • { • x=src. x; • y=src. y; • }
Пример • • • • • #include
• double med 1(double a, double b, double c) • {return sqrt(2*(b*b+c*c)-a*a)/2; } • double med 2(double a, double b, double c) • {return sqrt(2*(a*a+c*c)-b*b)/2; } • double med 3(double a, double b, double c) • {return sqrt(2*(b*b+a*a)-c*c)/2; } • double noparmed 1(void) • {return sqrt(2*(b*b+c*c)-a*a)/2; } • double noparmed 2(void) • {return sqrt(2*(a*a+c*c)-b*b)/2; } • double noparmed 3(void) • { return sqrt(2*(b*b+a*a)-c*c)/2; } • };
• Three. Angle: : Three. Angle(void) • { • a=0; b=0; c=0; • } • Three. Angle: : Three. Angle(double a 1, double b 1, double c 1) • { • a=a 1; b=b 1; c=c 1; • } • Three. Angle: : Three. Angle(const Three. Angle & src) • { • a=src. a; c=src. c; b=src. b; • }
>a; • cout<<"Give" src="https://present5.com/presentation/3/24163050_167342906.pdf-img/24163050_167342906.pdf-21.jpg" alt=" • void Three. Angle: : input() • { cout<<"Give a"; cin>>a; • cout<<"Give" />
• void Three. Angle: : input() • { cout<<"Give a"; cin>>a; • cout<<"Give b"; cin>>b; • cout<<"Give c"; cin>>c; • } • void Three. Angle: : output() • { • cout<<"a="<
• void main(void) • { • do • { • Three. Angle k; • k. input(); • k. output(); • cout<<"med 1="<
• cout<<"med 1="<
Дружественные функции
Пример • • class c 1 { … public: friend void frd(void); … }; frd – дружественная функция (friend function) класса с1.
• Пример объявления двух классов, в каждом из которых объявлена дружественная функция int same_color(line l, box b), не являющаяся членом ни первого, ни второго класса.
• • • class box { int color; int upx, upy; int lowx, lowy; public: friend int same_color(line l, box b); void set_color(int c); void define_box(int x 1, int y 1, int x 2, int y 2); void show_box(void); };
• • • class line { int color; int startx, starty; int len; public: friend int same_color(line l, box b); void set_color(int c); void define_line(int x, int y, int len); void show_line(void); };
• • • // Описание дружественной функции int same_color(line l, box b) { if (l. color==b. color) return 1; return 0; }
• void main(void) • { • line l; • box b; • b. define_box(5, 5, 25, 10); // прямоугольная область • b. set_color(RED); • l. define_line(5, 15, 30); // линия • l. set_color(BLUE); • b. show_box(); • l. show_line(); • if (same_color(l, b)) • cout<<”Одинаковые цвета”<
Замечание Структура программы имеет вид #include
• Дружественная функция может быть не только внешняя функция, но и функция – член другого класса. В предыдущем примере можно было объявить функцию same_color() функцией – членом класса box, а в классе line – дружественной функцией.
• • • class line; class box { int color; int upx, upy; int lowx, lowy; public: int same_color(line l); void set_color(int c); void define_box(int x 1, int y 1, int x 2, int y 2); void show_box(void); };
• • • class line { int color; int startx, starty; int len; public: friend int box: : same_color(line l); void set_color(int c); void define_line(int x, int y, int len); void show_line(void); };
• Следует обратить внимание, что в объявлении класса line указано полное имя функции box: : same_color(); Кроме того, можно не указывать в качестве аргумента объект класса box. Функция box: : same_color() может быть записана в виде: • int box: : same_color(line l) • { • if (l. color==color) return 1; • return 0; • }
Дружественные классы
• При объявлении класса можно объявить сразу все функции-члены другого класса дружественными одним объявлением: • class X{…}; • class Y • { • // … • friend class X; • // … • }; • Объявление класса дружественным предполагает, что приватные и защищенные члены класса Y могут использоваться в классе X.
• Аргументы функций, задаваемые по умолчанию • С++ предоставляет пользователю возможность установить значения параметров функции по умолчанию, если при вызове аргументы функции не были указаны. • Например функция f() имеет единственный целый аргумент и его значение по умолчанию должно равняться 10. Описание функции:
• • • void f(int i=10) { …. . } Вызвать функцию, определенную таким образом, можно двумя способами: f(1); // передаем значение аргумента i, равное 1. f(); // передаем значение i по умолчанию. Рассмотрим пример, в котором демонстрируется удобство установки аргументов по умолчанию. Функция при работе с текстовым экраном выводит указанную строку, начиная с заданного места экрана. Функция имеет имя stringxy() и не принадлежит
• • void stringxy(char *str, int x=-1, int y=-1) { if(x= = -1) x=wherex(); if(y= = -1) y=wherey(); gotoxy(x, y); cout<
Использование stringxy() приведено в следующем примере. • • • • #include
• // описание функции с аргументами, задаваемыми по умолчанию • // есть отличие заголовка функции от прототипа функции • void stringxy(char *str, int x, int y) • { • if(x= = -1) x=wherex(); • if(y= = -1) y=wherey(); • gotoxy(x, y); • cout<
Структуры и классы
• Структура может включать данные и правила обработки этих данных. Различие структур и классов в С++ состоит в том, что члены класса по умолчанию имеют режим доступа private, а в структуре члены структуры по умолчанию public.
Пример объявления структуры queue. • • • • struct queue { private: int q[100]; int sloc, rloc; int id; // идентификатор объекта public: queue(void); // конструктор по умолчанию queue(int i); // конструктор инициализации ~queue(void); // деструктор void qput(int); // прототипы int qget(void); // функций }; Объявление объектов структуры queue obj(1), obj 2;


