Понятие классов и объектов в C++. Инкапсуляция
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Понятие классов и объектов в C++. Инкапсуляция.
1) Запись структур в стиле C++
Пример структуры на Си.
Запись результата спортсмена по бегу (4 мин. 26 сек.) в виде структуры.
В стандарте Си структуры объявляются следующим образом:
typedef struct
{
int min;
int sec;
} Record;
int main(int argc, char* argv[])
{
Record a; // переменная a типа Record
a.min=4;
a.sec=26;
return 0;
}
На языке C++ структуры обычно записываются следующим образом:
struct Record
{
int min;
int sec;
};
// Внимание! Не забывать ставить точку с запятой
int main(int argc, char* argv[])
{
Record a; // переменная a типа Record
a.min=4;
a.sec=26;
return 0;
}
Далее используем синтаксис C++
2) Замена структуры struct на класс class
При простой замене возникает ошибка
class Record
{
1
int
int
};
min;
sec;
int main(int argc, char* argv[])
{
Record a; // переменная a типа Record
a.min=4; // здесь ошибка
a.sec=26; // здесь ошибка
return 0;
}
[C++ Error] Unit1.cpp(17): E2247 'Record::min' is not accessible (min недостуна)
Объяснение ошибки далее.
Правильный вариант использования class
class Record
{
public:
int min;
int sec;
};
int main(int argc, char* argv[])
{
Record a; // переменная a типа Record
a.min=4;
a.sec=26;
return 0;
}
Используем class и указываем public:
Это единственное небольшое различие между struct и class
3) Добавление методов в классы.
Кроме обычных переменных в классах (или структурах C++) могут быть функции и
переменные типа такого класса в main могут вызывать эти функции.
Для структуры Record добавим функцию, вычисляющую общее число секунд: 60*min+sec
class Record
{
public:
2
int min;
int sec;
int Numbersec(); // функция внутри Record возвращает int не имеет аргументов,
// работает с полями, здесь только заголовок
};
int Record::Numbersec() // Record:: - функция Numbersec
// принадлежит классу Record
{
return min*60+sec;
// работает с переменными внутри Record
}
int main(int argc, char* argv[])
{
Record a,b; // переменные типа Record
int k,m;
// обычные целые
// задание значений min,sec переменным a,b
a.min=4;
a.sec=26;
b.min=1;
b.sec=6;
// переменная a вызывает функцию, работающую со значениями
// переменных min,sec у a результат присваивается k
k=a.Numbersec(); // k=4*60+26=266
// переменная b аналогично вызывает Numbersec
m=b.Numbersec(); // m=1*60+6=66
return 0;
}
Терминология:
Переменные (или массивы) в классе (min,sec в Record) называются полями класса
Функции в классе (Numbersec) называются методами класса
Переменные типа класса (Record a,b;) называются объектами класса.
Пример с массивом объектов:
int main(int argc, char* argv[])
{
Record c[5];
int i,s;
for (i=0;i<5;i++)
{
c[i].min=1; // У всех 5 элементов min=1
c[i].sec=i; // c[0].sec=0 c[1].sec=1 ….
}
s=0;
for(i=0; i<5; i++)
3
{
s=s+c[i].Numbersec(); // s= 60+61+…
}
Пример класса с полем в виде массива:
class Sportsman
{
public:
char Fam[30]; // фамилия
…….
};
…….
int main(int argc, char* argv[])
{
Sportsman a;
strcpy(a.Fam,”Иванов”);
a.Fam[0]=’и’;
………………..
}
4) Инкапсуляция (ограничение доступа) public: и private:
Если поля и методы находятся после public: их можно использовать где угодно, если после
private: только внутри методов класса.
Добавим к Record метод округления до минут (если секунд больше 30 минуты
увеличить на 1 ).
class Record
{
public:
int min;
int Numbersec(); // количество секунд
private:
int Roundmin(); // округление до минуты
int sec;
};
// min, Numbersec() - public
// sec, Roundmin() - private
int Record::Numbersec()
{
4
return min*60+sec;
}
// ошибки нет метод класса имеет доступ ко всем полям и методам
int Record::Roundmin()
{
int k; // локальная переменная
if(sec>30) // ошибки нет private Roundmin может обращаться ко всем полям и методам
k=1;
else
k=0;
return min+k; // ошибки нет Roundsec обращается к public min
}
int main(int argc, char* argv[])
{
int m;
Record a;
a.min=5; // правильно min – public
a.sec=10; // неправильно sec – private
m=a.Numbersec(); // правильно Numbersec – public
m=a.Roundmin(); // не правильно Roundmin() - private
}
Мнемоническое правило: идентификаторы private могут появиться только внутри
методов класса, как publc так и private. Идентификаторы public где угодно.
Различие между class и struct
В struct по умолчанию поля и методы public, в class – private
пример: работает min,sec public
struct Record
{
int min;
int sec;
};
int main(int argc, char* argv[])
{
Record a; // переменная a типа Record
a.min=4;
a.sec=26;
return 0;
}
пример не работает min,sec - private
5
class Record
{
int min;
int sec;
};
int main(int argc, char* argv[])
{
Record a; // переменная a типа Record
a.min=4; // здесь ошибка
a.sec=26; // здесь ошибка
return 0;
}
[C++ Error] Unit1.cpp(17): E2247 'Record::min' is not accessible (min недостуна)
Вывод : используем class и сразу пишем public: потом private:
5) Стиль C++ основные поля объявляются private, доступ к ним через
public методы
пример для Record
class Record
{
public:
int Numbersec(); // количество секунд
void Put(int m,int s); // задание значений полей
int Getmin();
// число минут
int Getsec();
// число секунд
private:
int min;
int sec;
};
void Record::Put(int m,int s)
{
min=m;
sec=s;
}
int Record::Getmin()
{
return min;
}
6
int Record::Getsec()
{
return sec;
}
int Record::Numbersec()
{
return min*60+sec;
}
int main(int argc, char* argv[])
{
int m,s,k;
Record a;
a.Put(5,36); // min=5 sec=36
k=a.Numbersec();
m=a.Getmin();
// m=5
s=a.Getsec();
// s=36
printf(“%d %d %d”, k,m,s);
}
6) Аргументами методов могут быть объекты своего или других
классов, результатом тоже может быть объект некоторого
класса.
В классе Record определим метод, вычисляющий среднее время спортсмена по двум
попыткам. Аргументами метода Srednee будут два объекта Record, результатом также объект
класса Record.
class Record
{
public:
int Numbersec(); // количество секунд
void Put(int m,int s); // задание значений полей
int Getmin();
// число минут
int Getsec();
// число секунд
Record Srednee(Record a,Record b); // аргументы объекты Record и результат тоже.
private:
int min;
int sec;
};
void Record::Put(int m,int s)
{
7
min=m;
sec=s;
}
int Record::Getmin()
{
return min;
}
int Record::Getsec()
{
return sec;
}
int Record::Numbersec()
{
return min*60+sec;
}
Record Record::Srednee(Record a,Record b)
// Record Record:: первый Record– тип возврата, функция возвращает Record,
// второй Record:: - Srednee относится к классу Record
{
Record c; // локальная переменная типа Record
int k;
// обычная целая
c.min=a.min+b.min;
k=a.sec+b.sec;
if(k>=60)
// проверка переноса
{
c.min++;
k=k-60;
}
c.min=c.min/2;
c.sec=k/2;
return c;
// функция возвращает объект класса Record
}
int main(int argc, char* argv[])
{
int m,s,k;
Record x,y,z;
x.Put(4,36); // min=4 sec=36
y.Put(2,4); // min=2 sec=4
k=y.Numbersec(); // k=124
z=z.Srednee(x,y);
// объект z вызывает метод Srednee с аргументами x,y
// возвращается объект типа Record, который
// присваивается z
8
printf(“%d “,k);
m=z.Getmin();
s=z.Getsec();
printf(“%d %d”,m,s); // 3 20
}
При выполнении лабораторных и этапов курсовой работы следует определить методы Init
для инициализации всех полей, Read для ввода значений всех полей и Display для вывода
значений всех полей.
Для Record методы имеют вид:
class Record
{
public:
int Numbersec(); // количество секунд
int Getmin();
// число минут
int Getsec();
// число секунд
Record Srednee(Record a,Record b);
void Read();
void Display();
void Init(int m,int s);
private:
int min;
int sec;
};
...............................
void Record::Read()
{
scanf(“%d,%d”,&min,&sec);
}
void Record::Display()
{
printf(“%d, %d”,min,sec);
}
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
int main(int argc, char* argv[])
{
Record a,b;
a.Read();
// ввод с консоли 2 35
b.Init(1,19); //
9
a.Display(); // 2 35
printf(“\n”);
b.Display(); // 1 19
}
7) полями одного класса могут быть объекты другого, ранее
определенного класса
При этом ранее определенный класс считается вспомогательным, а определяемый основным.
После класса Record определим класс Sportsman , в котором имеется фамилия и два
результата по бегу. Для Sportsman определим методы доступа к фамилии и метод Best
определение лучшего из двух результатов. Также определим метод InitRez для задания двух
результатов спортсмена.
В Record оставлено минимальное число методов для иллюстрации
class Record
{
public:
int Numbersec(); // количество секунд
void Init(int m,int s); // задание начальных значений полей
private:
int min;
int sec;
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
int Record::Numbersec()
{
return min*60+sec;
}
class Sportsman
{
public:
char* GetFam();
// возвращает строку-фамилию
void PutFam(char *s); // задание фамилии
Record Best();
// выбрать из двух результатов лучший и вернуть
void InitRez(int m1,int s1,int m2,int s2); // задание значений min,sec обеим результатам
private:
10
char Fam[30];
// фамилия
Record FirstRezult; // первый результат спортсмена
Record SecondRezult; // второй результат спортсмена
};
char* Sportsman::GetFam()
{
return Fam;
}
void Sportsman::PutFam(char *s)
{
strcpy(Fam,s);
}
void Sportsman::InitRez( int m1,int s1,int m2,int s2)
{
FirstRezult.Init(m1,s1);
// FirstRezult.min=m1 FirstRezult.sec=s1
SecondRezult.Init(m2,s2); // SecondRezult.min=m2 SecondRezult.sec=s2
// FirstRezult.min=m1;
// ошибка обращенеие к private
}
Record Sportsman::Best()
{
int sec1,sec2; // секунды первого и второго результатов
sec1=FirstRezult.Numbersec(); // вычисление числа секунд 1 результата
sec2=SecondRezult.Numbersec(); // вычисление числа секунд 2 результата
if (sec1Pu
strcpy(c,P.GetFam());
printf("%s",c);
// вывод извлеченной фамилии Pu
printf("\n");
M.PutFam("Me"); // фамилия у Z ->Me
strcpy(c,M.GetFam());
printf("%s",c);
// вывод извлеченной фамилии Me
printf("\n");
11
// кто из спортсменов лучше
P.InitRez(1,15,2,5); // у P 1 мин,15 сек и 2 мин,5 сек
M.InitRez(3,5,1,40); // у Z 3 мин,5 сек и 1 мин, 40 сек
// P.FirstRezult.Init(1,15); // ошибка вызов P.FirstRezult private
pb=P.Best();
// pb лучшее время у P (1 мин, 15 сек)
zb=M.Best();
// zb лучшее время у Z (1 мин, 40 сек)
psec=pb.Numbersec(); // число секунд во времени pb (75)
zsec=zb.Numbersec(); // число секунд во времени zb
if(psec
Тебе могут подойти лекции
А давай сэкономим
твое время?
твое время?
Дарим 500 рублей на первый заказ,
а ты выбери эксперта и расслабься
Включи камеру на своем телефоне и наведи на Qr-код.
Кампус Хаб бот откроется на устройстве
Не ищи – спроси
у ChatGPT!
у ChatGPT!
Боты в Telegram ответят на учебные вопросы, решат задачу или найдут литературу
Попробовать в Telegram
Оставляя свои контактные данные и нажимая «Попробовать в Telegram», я соглашаюсь пройти процедуру
регистрации на Платформе, принимаю условия
Пользовательского соглашения
и
Политики конфиденциальности
в целях заключения соглашения.
Пишешь реферат?
Попробуй нейросеть, напиши уникальный реферат
с реальными источниками за 5 минут
с реальными источниками за 5 минут
Понятие классов и объектов в C++. Инкапсуляция
Хочу потратить еще 2 дня на работу и мне нужен только скопированный текст,
пришлите в ТГ