Гишүүн функц -...

Post on 05-Dec-2020

15 views 0 download

Transcript of Гишүүн функц -...

Гишүүн функц Лекц-10

Багш: Д.Саулегүл

-Гишүүн функцын хэрэглээ -Inline гишүүн функц

Гишүүн функцын хэрэглээ

Гишүүн функ нь классын гишүүн болох бөгөөд гишүүн өгөгдлүүдийн хамт байна.Өмнө бид класс ба бүтцийн гишүүд нь зөвхөн өгөгдөл байхыг харсан.

C++-ийн бүтцэд мөн гишүүн функц гэдэг ойлголт бий болсон.

Class Date { int day; int month; int year; public: int bonus_flag; int get_month(void); int get_day(void); int get_year(void); void set(const int d, const int m;const int y); }; Date today, tomorrow;

Энд зарласан класс нь гишүүн өгөгдөл болон гишүүн

фунцийг хоѐуланг нь агуулж байна. today, tomorrow

гэсэн date классын хоѐр объект тодорхойлогдсон ба

энэ зарлалт нь main () функцийн өмнө байрлавал

тэдгээр нь глобал хувьсагч болно.Хэдийгээр глобал

хувьсагчид нь локалыг бодвол (утга өөрчлөгдөх)

найдвар муутай ч эдгээр глобал хувьсагчдад дараах

асуудал яригдана.

Хоѐр объект нь day, month, year гэсэн гурван private гишүүн өгөгдөл агуулна.main () болонбусад ямар ч функц эдгээр объектын private гишүүдэд хандаж чадахгүй.Өөрөөр хэлбэл тэдгээр гишүүдийн утгыг өөрчлөх болон унших боломжгүй.Харин public гишүүн болох bonus flag хувьсагчийн хувьд ойлгомжтой.

Дараах зарлалтаар класс бүрэн тодорхойлогдоно.Учир нь гишүүн өгөгдөл нь гишүүн функцийн кодын хамт байна.

class Date {

int day; //private гишүүн өгөгдөл

int month;

int year;

public:

int bonus_flag;

int get_day (void) //inline public гишүүн функц

{ return (day); } //inline түлхүүр үг ашиглахгүй

int get_month (void)

{ return (month) ; }

int get_year (void)

{ return (year) ; }

void set (const int d,const int m,const y) {

{ day = d ;

month = m ;

year = y ;

return; }

};

Date today, tomorrow;

Объект дахь гишүүн өгөгдөл ба гишүүн функцийн нэгдлээр ОХП-ын нэг чухал ойлголт болох “encapsulation”илэрдэг. Энэ нь объектын биеэ даасан байдал юм.

Классын муж

Зөвхөн set () гишүүн функц нь day,month,year

-ийн утгыг өөрчилж чадна.Эдгээр гурван гишүүд нь private учраас зөвхөн энэ классын гишүүн функц л хандаж чадна.Date классын хоѐр глобал объект зарлагдсан учир эдгээр хувьсагчдад main() функц хандаж чадна.Гэвч main() функц эдгээр объектуудын (гишүүн) хэсэг бүрт хандаж чадахгүй. C++-т С-д байхгүй нэмэлт муж байдаг. Энэ нь классын муж юм. Private гишүүд нь зөвхөн классын мужтай байна.Тэд класс дотор л харагдана.

#include <iostream.h>

Class Date {

int day;

int month;

int year;

int test_day (const int d)

{ return (d>31) ? 0; 1; }

int test_month (const int mn

{ return (m>12) ? 0; 1;}

int test_year (const int y)

{ return (y<1990) ? 0; 1;}

public:

int bonus_flag;

int get_day (void)

{ return (day) ; }

int get_month (void)

{ return (month) ; }

int get_year (void)

{ return (year) ; }

int set (const int d,const int m,const int y) {

if (test_day (d) && test_month (m) && test_year (y) ) {

day=d;

month=m;

year=y

return(1);

}

};

Void main ()

{

Date today;

int m,d,y;

cout<<“Хэдний өдөр вэ? Өдөр,сар,он

(г.м. , 26 11 1995)?”;

cin>> d >> m >>y; // Date класст утга олгох

// ба хэрэв зөв бол хэвлэх

if (today.set(d,m,y) ) {

cout<<“Энэ өдөр бол : ”<<today.get_day ();

cout<<“/”<<today.get_month () << “/”;

cout<< today.get_year () <<“\n”;

}

else { cout << “Та буруу утга оруулсон байна”; }

}

Inline биш гишүүн функц Зөвхөн public гишүүн функц класст байснаар та

объектын private гишүүн өгөгдөлд ба функцэд хандаж чадна.Өмнөх бүлэгт бүх код нь класс дотроо агуулагдаж байсан бол одоо зөвхөн гишүүн өгөгдөл ба гишүүн функцийн зарлалтыг агуулах классыг үзүүлье.

Class Date {

int day ;

int month ;

int year;

int test_day(const int d);

int test_month(const int m);

int test_year(const int y);

public :

int bonus_flag ;

int get_day (void);

int get_month (void);

int get_year (void);

int set (const int d, const int m, const int y);

};

Энэ классын дүрслэл өмнөхийг бодвол богино, яагаад гэвэл гишүүн функцүүдийн кодыг агуулаагүй.

Харин гишүүн функцийн код нь классын гадна дараах маягаар тодорхойлогдоно.

int Date: :test_day(const int d) { return ( (d>31) ? 0:1) ; } … int Date: :get_day (void) { return (day) ; } … int Date: :set(const int d, const int m, const int y) { if (test_day(d) && test_month(m) && test_year(y)) { day = d; month = m; year = y; } else return(0) ; }

Өмнө бид ( : : ) операторыг ашиглан локал хувьсагчтай ижил нэртэй глобал хувьсагч уруу хандаж байсан билээ.Тэгвэл классын гишүүн функцийг тодорхойлоход бас ашигладаг. Inline биш гишүүн функц ашиглах үед функцийн нэрийн өмнө классын нэрийн ( : : ) операторын хамт бичнэ.Үүний учир нь программд олон класс байж болох бөгөөд хэд хэдэн класс нэг ижил нэртэй гишүүн функцийг ашиглаж болно. Жишээ нь:employee класс, customer класс supplier класс бүр нь disp() гэсэн гишүүн функцтэй гэе. disp()-ийн кодууд классын гадна тодорхойлогдох үед аль нь ямар классын гишүүн функц болохыг С++д хэлж өгөх хэрэгтэй. Өөрөөр хэлбэл функцийн мужийг шийдэх ѐстой.Эндээс мужлал тогтоох оператор гэдэг ойлголт гарч ирсэн. Disp() функцүүдийн хэлбэр нь дараах байдалтай байна.

Void Customer: :disp ()

{

//код

}

Void Employee: :disp ()

{

//код

}

Void Supplier: :disp ()

{

//код

}

#include <iostream.h> Class Date { int day ; int month ; int year; int test_day(const int d); int test_month(const int m); int test_year(const int y); public : int bonus_flag ; int get_day (void); { return (day) ; } int get_month (void); { return (month) ; } int get_year (void); { return (year) ; } int set (const int d, const int m, const int y); };

Int Date : : test_day (const int d) { return (d>31) ? 0; 1; } int Date : : test_month (const int m) { return (m>12) ? 0; 1;} int Date : : test_year (const int y) { return (y<1990) ? 0; 1;} int Date : : set (const int d, const int m, const int y) { if (test_day(d) && test_month(m) && test_year(y)) { day=d; month=m; year=y; return (1); } else return (0) ; } void main ()

{

Date today;

int m,d,y;

cout<<“Хэдний өдөр вэ? Өдөр,сар,он (г.м.,26 11 1995)?”

cin >> d >> m >>y; //Date класст утга олгох ба хэрэв зөв бол хэвлэх

if (today.set(d,m,y)) {

cout << “Энэ өдөр бол : “<< today.get_day();

cout <<“/” today.get_month () << “/”;

cout << today.get_year () <<“\n”;

}

else {

cout << “Та буруу утга оруулсан байна.”; }

}

Энэ программ өмнөх хэсгийнхтэй ижил боловч гишүүн гишүүн функцүүд нь классын гадна байна. Харин get_day (),get_month(),get_year() функцүүднь класс дотор учир inline байна. Хэрвээ эдгээр функцүүд хангалттай бага хэмжээтэй бол тэдгээр нь классын гадна inline байж болно.Энэ үед inline гэдэг үгийг функцийн нэрийн өмнө тавина.

Inline int Date: :test_day(int d) {

return (d>31) ? 0:1;

}

#include <iostream.h> Inline int max (int a,int b) { return a > b > a : b; } main () { cout << max(10,20) ; cout << “ “ << 99 > 88 ? 99, 88; return 0 ; } C++ хэлний нэг чухал нэмэлт болох inline функцийн мөн

чанар нь кодыг ашигтайгаар үүсгэхэд оршдог. Магадгүй та функцийн дуудалт бүрт үүсэх “дуудах” ба “буцаах” механизмын мэдэх биз.Үнэндээ энэ нь функц дуудагдах үед аргументуудыг стект хийж регистрүүдйин утгыг хадаглаад ,дараа нь функцээс буцах үед сэргээдэг.Эдгээр үйлдлйиг гүйцэтгэхэд хугацаа алддаг.

Харин мөрөнд функцийг өргөтгөх үед энэ үйлдлүүд хийгдэхгүй.Мөн мөрөнд өргөтгөгдсөн функц нь программын ажиллах хурдыг ихэсгэж ,кодын давхацлыг арилгаснаар програмын хэмжээг багасгах сайн талуудтай.Энэ бүх шалтгаануудас үүдэн inline нь зөвхөн маш богино фукцэнд хамгийн тохиромжтой.

Inline нь команд биш бөгөөд register түлхүүр үгийн нэгэн адил ердөө л нэг шаардлага юм.

#include<iostream.h> Class myclass { Int a,b; public: void init (int i , int j) void show(); }; Inline void myclass : : init( int i, int j) { a = j ; b = j ; } Inline void myclass : : show ( ) { cout << a << “ “ << b << “ \ n ” ; } Main ( ) { myclass x ; x. show ( ) ; return 0 ; }

Inline функцийг класс дотор тодорхойлох нь Классын зарлалт дотор богинохон функцийг ( кодын)

тодорхойлж болдог .Класс дахь ингэж тодорхойлогдсон функц нь автоматаар inline функц болно .Иймд функцийн нэрийн өмнө inline түлхүүр үгйиг заавал тавих шаардлагагүй Жишээлбэл дээрх программ дахь myclass классын init( ) ,show ( ) гишүүн функцүүдийг класс дотор дотор тодорхойлж өгснөөр inline функц болно

Тэмдэглэн хэлэхэд бидний жишээн дэх show ( ) функц нь inline фунцк хэлбэрээр тодорхойлогдсон хэдий ч түүнд хэрэглэгдэх О\Г –ын бичлэгүүдийг ( cout ) дуудан ажилуулахад хугацаа шаардагддагаас энэ нь ач холбогдол багатай юм. Гэвч c++ прогламмд богинохон гишүүн функцийг класс дотор тодорхойлсон нь элбэг тохиолддог

Локал класс

Класс нь функц дотортодорхойлогдсон байж болно . Мэдээж функц дотор зарлагдсан класс нь зөвхөн уг функцээ ашиглагдах болно. Локал класст хэд хэдэн хязгаарлалтууд байдаг. Нэгдүгээрт, бүх гишүүн функүүд нь inline байх естой . Локал класс нь тодорхойлогдсон функцийнхээ ямар нэг локал хувьсагчийг ашиглаж болохгүй . Гэсэн хэдийч локал класс нь статик локал хувьсагчдыг ашиглаж болбх тохиолдол байдаг Локал класс дотор ямар ч статик хувьсагч тодорхойлж болбхгүй. Эдгээр хязгаарлалтуудын улмаас локал класс нь c++ программд бараг ашиглагддаггүй.

Ижил функц , ялгаатай объектууд Нэг классын хоер өөр объетод ижил гишүүн функцүүд

ашиглагддаг . Жишээ нь : Class People ( char *name; … Publlic … void set_ name (const char *); }; People teacher , student; \\ ялгаатай хоер объект Teacher.set _name(“Mary”); Student.set_name(“George”); Дээрх программын хэсгээс харахад teacher ба student гэсэн

хоер өөр объектод ижил гишүүн функц үйлчилж байна . Энэ нь c++ ийн онцлог юм. Гэвч энэ хоер объект нь ялгаатай ч нэг классын ижил төрлийн объектууд юм.

This заагч

Өмнөх хэсгээс гишүүн функц нь класстайгаа хэрхэн холбогдхыг ойлгосон байх .Тэгвэл гишүүн функц нь классын аль объектод үйлчилхийг яаж мэдэх вэ?

Үүнийг *this гэж нэрлэгдэх заагчийн тусламжтайгаар шийддэг.