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

27
Гишүүн функц Лекц-10 Багш: Д.Саулегүл -Гишүүн функцын хэрэглээ -Inline гишүүн функц

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

Page 1: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

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

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

Page 2: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

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

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

Page 3: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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;

Page 4: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

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

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

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

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

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

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

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

Page 5: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

Page 6: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

class Date {

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

int month;

int year;

public:

int bonus_flag;

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

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

Page 7: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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”илэрдэг. Энэ нь объектын биеэ даасан байдал юм.

Page 8: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

Классын муж

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

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

Page 9: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

#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;

Page 10: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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);

}

};

Page 11: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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 << “Та буруу утга оруулсон байна”; }

}

Page 12: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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);

Page 13: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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);

};

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

Page 14: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

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) ; }

Page 15: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

Page 16: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

Void Customer: :disp ()

{

//код

}

Void Employee: :disp ()

{

//код

}

Void Supplier: :disp ()

{

//код

}

Page 17: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

#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); };

Page 18: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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 ()

Page 19: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

{

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 << “Та буруу утга оруулсан байна.”; }

}

Page 20: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

Inline int Date: :test_day(int d) {

return (d>31) ? 0:1;

}

Page 21: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

#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 функцийн мөн

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

Page 22: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

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

Page 23: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

#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 ; }

Page 24: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

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

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

Page 25: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

Локал класс

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

Page 26: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

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

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

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

Page 27: Гишүүн функц - soyolerdem.edu.mnsoyolerdem.edu.mn/online/wp-content/uploads/2017/03/gishuun-function-10.pdfКлассын муж Зөвхөн set гишүүн функц

This заагч

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

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