86 lines
No EOL
4.2 KiB
C++
86 lines
No EOL
4.2 KiB
C++
/*
|
||
Конструктор
|
||
|
||
Конструктор - это специальный метод, который вызывается при создании объекта
|
||
|
||
Конструктор Book(const char aTitle[], float aPrice, int aPages) принимает три аргумента и задаёт
|
||
этими аргументами поля класса, а также печатает на экран слово Constructor.
|
||
|
||
Конструктор вызывается в строке Book a = Book("War and Peace", 1700, 900).
|
||
В этом примере конструктор делает то же самое, что и обычная инициализация структуры: Book a = {"War and Peace", 1700, 900};
|
||
Преимущество конструктора по сравнению с обычной инициализации структур состоит в том, что программист может сам задать то,
|
||
что будет происходить при создании объекта.
|
||
|
||
|
||
Напоминание:
|
||
Функция strcpy из библиотеки string.h языка C принимает на вход 2 строки и просто копирует
|
||
содержимое второй строки в первую строку.
|
||
|
||
*/
|
||
|
||
#include <iostream>
|
||
#include <cmath>
|
||
#include <string.h>
|
||
using std::cout, std::endl;
|
||
|
||
|
||
struct Book
|
||
{
|
||
char title[100];
|
||
float price;
|
||
int pages;
|
||
|
||
Book(const char aTitle[], float aPrice, int aPages)
|
||
{
|
||
cout << "Constructor" << endl;
|
||
strcpy(title, aTitle);
|
||
price = aPrice;
|
||
pages = aPages;
|
||
}
|
||
|
||
|
||
void print() const
|
||
{
|
||
std::cout << title << ", price = " << price << ", pages = " << pages << std::endl;
|
||
}
|
||
};
|
||
|
||
|
||
|
||
int main()
|
||
{
|
||
Book a = Book("War and Peace", 1700, 900);
|
||
a.print();
|
||
|
||
Book b = Book("The Great Gatsby", 800, -600);
|
||
b.print();
|
||
|
||
}
|
||
|
||
|
||
/*
|
||
Задачи:
|
||
|
||
1) Предположим, что программист, работая с наши классом Book, ошибся в конструкторе и установил у книги отрицательное количество страниц.
|
||
|
||
Измените конструктор таким образом, чтобы программа не создавала объект с отрицательным числом страниц.
|
||
Вместо этого она должна писать сообщение об ошибке и выходить из программы.
|
||
Для выхода из программы можно использовать функцию std::exit(1) из библиотеки <cstdlib>
|
||
|
||
|
||
2) Конструкторы можно перегружать также, как и обычные функции и методы.
|
||
Добавьте новый конструктор, который не будет принимать никаких аргументов и будет создавать объект с полями равными
|
||
title: "Default" price: 0 pages: 0
|
||
Вызовите этот конструктор из main
|
||
|
||
Конструктор, который не принимает аргументов, называется конструктором по умолчанию.
|
||
|
||
|
||
|
||
3) Конструкторы можно перегружать также, как и обычные функции и методы.
|
||
Добавьте новый конструктор, который будет принимать объект типа Book (по константной ссылке)
|
||
и будет задавать поля текущего объекта, используя поля аргумента
|
||
Вызовите этот конструктор из main
|
||
|
||
Конструктор, который создаёт объект, используя объект такого-же типа, называется конструктором копирования.
|
||
*/ |