ОББН лекция 2. Си программалау тіліне кіріспе Жоспар
Скачать 128.11 Kb.
|
Операторларды қайта анықтауЖоспар 1. Операторларды қайта анықтау2. Плюс және минус операторларын қайта анықтау1. Операторларды қайта анықтауБіз білетініміздей, айнымалының типі алынатын мәндер жиынын анықтайды, оларды сақтайды және осы айнымалыларға қолданылатын операцияларды анықтайды.Мысалы, int типті айнымалыға программада қосу, көбейту, азайту және бөлу амалдары орындалады. Бір қарағанда қосу амалын екі жолды біріктіруге қолдануға болмайтын сияқты..Программада класс ұғымы енгізілген уақытта біз жаңа тип анықтаймыз. Сондқтан, C++ тілі осы жаңа типке қатысты операцияларды анықтауға мүмкіндік береді. Операторды қайта анықтау дегеніміз нақты анықталған класта оның мағынасын өзгерту (мысалы, плюс (+) операторы, әдетте C++ тілінде ол қосу үшін қолданылады). Біз осы бөлімде string атты класс алып, онда плюс және минус операторларын қайта анықтаймыз. String типті объектілер үшін плюс операторы алынған символдарды жолдың мәніне қосады, ал минус операторы әрбір символды жолдың мәнінен алып тастайды. Операторларды қайта анықтау класта анықталған жалпы операцияларды анықтауға және олардың оқылуын оңайлатуға көмек береді. 2.Плюс және минус операторларын қайта анықтауОператорды кезөкелген класқа қайта анықтағаннан, ол оператордың мағынасы басқа айнымалардың типтері үшін өзгермейді. Мысалы, егер сіз плюс операторын string класы үшін қайта аықтасаңыз, онда ол оператордың мағынасы екі санды қосқанда өзгермейді. С++ компиляторы программада операторды кездестіргенде, айнымалының типіне байланысты оның қандай операция орындайтынын өзі анықтайды. Төмендегі мысалда біз string класын құрастырамыз. Бұл класта бір ғана мәлімет элементі бар, ол символдық жол. Сонымен бірге, бұл класта әртүрлі тәсілдер бар, бірақ олар әзірше ешқандай операторды анықтамайды: class string { public: string(char*);//Конструктор voidstr_append(char*); voidchr_minus(char); voidshow_string(void); private: chardata[256]; }; Класта str_append функциясы анықталған, ол берілген символдарды жолдың соңына қосады. Дәл осы сияқты chr_minus функциясы – берілген символды кластың жолынан жойып отырады.Төмендегі программада осы жағдайлар қарастырылған. #include #include class string { public: string(char*);//Конструктор voidstr_append(char*); voidchr_minus(char); voidshow_string(void); private: chardata[256]; }; string::string(char *str) { strcpy(data,str); } void string::str_append(char *str) { strcat(data,str); } void string::chr_minus(char letter) { chartemp[256]; intI,j; for (I = 0, j = 0; data[i]; i++) // бұл әріпті жою қажет пе? if (data[i] != letter) // жоқ болса, tempөке меншікте temp[j++] = data[i]; temp[j] = NULL; // tempөтің соңы // tempөтің мәнінің dataөқа көшірмесін ал strcpy(data,temp); } void string::show_string(void) { cout<} void main(void) { string title(“ C++ тілінде программалау “); stringlesson(“Операторларды қайта анықтау”); title.show_string(); title.str_append(“Үйренеміз!”); itle.show_string(); lesson.show_string(); lesson.chr_minus(‘p’); lesson.show_string(); } Программада көрсетілгендей str_append функциясы символдарды жолдық айнымалы titleөге қосады,ал chr_minus функциясы “р” әріпін lesson символдық жолдан жою үшін қолданылады . Бұл жерде программа функцияларды шақырып берілген операцияларды орындайды. Бірақ, операторларды қайта анықтау арқылы, программа осы операцияларды плюс (+) және минус (ө).операторларының көмегімен орындай алады. Операторларды қайта анықтағанда C++ тілінде, функцияның прототипі және анықтамасымен бірге operator қызметші сөзі қолданылады. Ол компиляторға C++, осы класс бұл тәсілді оператор ретінде қолданатынын білдіреді. Мысалы, келесі класс анықтамасы operator қызметші сөзін қолданып плюс және минус операторларын str_append және chr_minus функцияларына string класының ішінде береді: class string { public: string(char*);//Конструктор voidoperator+(char*); void operator ө(char); ————— voidкласындағы операторлар show_string(void); private: chardata[256]; }; Көріп отырғанымыздай, класта плюс және минус операторлары қайта анықталады. Класс операторды қайта анықтағанда, ол осы операторға сәйкес операцияны орындайтын функцияны көрсетуі тиіс. Плюс операторы үшін мұндай функцияны анықтау: void string::operator +(char *str) { strcat(data,str); } Көріп отырғанымыздай, кластың қайта анықталатын операторы пайдаланылатындықтан функция анықтамасының атуы болмайды. Плюс операторын программада қолдану ісөәрекетін өзгерткен жоқ, (функция коды алдыңғы str_append функция кодымен бірдей). Программада функция атауы қызметші сөз operatorsө бен ауыстырылған. Төменгі программада қайта анықталатын плюс және минус операторлары берілген: #include #include class string { public: string(char*);//Конструктор voidoperator+(char*); voidoperatorө(char); voidshow_string(void); private; chardata[256]; }; string::string(char *str) { strcpy(data,str); } void string::operator +(char *str) { strcat(data,str); } void string::operator ө(char letter) { chartemp[256]; intI,j; for (I = 0, j = 0; data[i]; i++) if (data[il 1= letter) temp[j++] = data[i]; temp[j]=NULL; strcpy(data,temp); } void string::show_string(void) { cout<} void main(void) { stringtitle( “ C++ тілінде программалау”); stringlesson(“операторды қайта анықтау”); title.show_string(); title+“үйренеміз!”; title.show_string(); lesson.show_string(); lesson‘P’; lesson.show_string(); } Программада қайта анықталатын операторлар қолданылады: title + « үйренеміз!»; // мәтінді қосу « үйренеміз!» lesson ө 'р'; // 'р' әріпін жою Бұл жерде оператордың жазылуы дұрыс. Әдетте плюс операторы мәнді қайтаратын өрнектерде some_str = title + «мәтін» беріледі. C++ тілінде операторды қайта анықтағанда , оның ісөәрекетін толық анықтау прораммистке жүктеледі. Бірақ операторларды қайта анықтаудағы біздің негізгі мақсатымыз программаны оқытуды жеңілдету. Сондықтан, келесі программа алдыңғы программаны ептеп өзгертіп, string типті айнымалыларға стандартты меншіктеу операторымен сәйкестендірілген операцияны жүргізу үшін: #include #include class string { public: string(char*);// Конструктор char*operator+(char*); char*operatorө(char); voidshow_string(void); private: chardata[256]; } ; string::string(char *str) { strcpy(data,str); } char * string::operator +(char *str) { return(strcat(data,str)); } char * string::operator ө(char letter) { chartemp[256]; intI,j; for (I = 0, j = 0; data[i]; i++) if (data[i] 1= letter) temp[j++] = data[i]; temp[j]=NULL; return(strcpy(data,temp)); } void string::show_string(void) { cout<} void main(void) { stringtitle(“C++ тілінде программалау”); stringlesson(“операторларды қайта анықтау”); title.show_string(); title=title+“үйренеміз”; title.show_string(); lesson.show_string(); lesson=lessonө‘?’; lesson.show_string(); } Изменив перегруженные операторы плюс и минус таким образом, чтобы они возвращали указатель на символьную строку, программа может теперь использовать эти операторы в привычном для оператора присваивания виде: title = title + « программалауға үйренеміз!»; lesson = lesson ө ‘р’; 2. Қайта анықтауға болмайтын операторлар Жалпы жағдайда С++тілінде барлық операторларды қайта анықтауға болады.Бірақ төменде көрсетілген кейбір операторларды қайта анықтауға болмайды
Операторларды қайта анықтау — нақты сипатталған класта оның мағынасын анықтау. Қайта анықтау операторларын қолдану арқылы, сіз программаның оқылуын және түсінуін жеңілдете аласыз. Сонымен: Операторды қайта анықтау үшін, алдымен оның сәйкес класы сипатталады. Операторды қайта анықтағанда, өзі анықталған класта ғана әсер етеді. Егер программада сипатталған класқа сәйкес келмейтін айныалылар кездессе, онда (мысалы, int немесе float типті айнымалылар) стандартты операторлардың анықтамасы қолданылады. Операторды қайта анықтағанда operatorқызметші сөзі қолданылады. |