Справочник от Автор24
Поделись лекцией за скидку на Автор24

Понятие классов и объектов в C++. Инкапсуляция

  • 👀 242 просмотра
  • 📌 225 загрузок
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Понятие классов и объектов в C++. Инкапсуляция» doc
Qt нач. с 5.0 visual studio c++ нач. 2010 java jdk, netbeans или Eclipse visual studio c# нач. с 2010 android sdk плагин для Eclipse или Android Studio Понятие классов и объектов в 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 { 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 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: 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++) { 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() { 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 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; } 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) { 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 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); // 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: 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"); // кто из спортсменов лучше 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
«Понятие классов и объектов в C++. Инкапсуляция» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ
Получи помощь с рефератом от ИИ-шки
ИИ ответит за 2 минуты

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot