تارا فایل

پاورپوینت برنامه نویسی شی گرا و اشاره گرها


ساختار ها و اشاره گرها

فهرست مطالب
ساختارها
اشاره گرها (Pointer)
تعریف آرایه
آرایه ها و اشاره گرها
رشته ها و توابع مربوطه

ساختارها
ساختارها شبیه آرایه ها بوده بدین صورت که یک نوع داده گروهی است که فضای پیوسته از حافظه اصلی را اشغال می نماید. اما عناصر ساختار الزاماً از یک نوع نمی باشند بلکه اعضای یک ساختار می توانند از نوع های مختلفه از قبیل char ، int ، float ، … باشند.

تعریف ساختار
struct time
{
int hour ; // 0 – 23
int minute ; // 0 – 59
int second; //
} ;
نام ساختار
اعضا ساختار

مثال :
struct account
{
int acc_no ;
char acc_type;
char name[80] ;
float balance ;
};
ساختار account دارای چهار عضو می باشد.
acc_no شماره حساب از نوع int
acc_type نوع حساب از نوع char
name مشخصات صاحب حساب از نوع رشته 80 کرکتری
balance مانده حساب از نوع float

به دو صورت می توان اعلان یک متغیر از نوع ساختار را نمایش داد :
struct account
{
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cust2, cust3;
struct account
{
int acc_no ;
char acc_type;
char name[80];
float balance;
};
account cust1, cust2, cust3;
روش اول :
روش دوم :

به ساختارها می توان مقدار اولیه نیز تخصیص داد
account cust = {4236, r, Nader Naderi , 7252.5};

دسترسی به عناصر یک ساختار
بمنظور دسترسی به عناصر یک ساختار از عملگر . استفاده
می گردد . عملگر. جزء عملگرهای یکتائی می باشد.

مثال :
cust .acc_no = 4236
cust .acc_type = r
cust .name = Nader Naderi
cust .balance = 7252.5

نکته :
عضو یک ساختار خود می تواند یک ساختار دیگر باشد.
struct date
{
int month;
int day;
int year;
};
struct account
{
int acc_no ;
char acc_typer;
char name[80];
float balance ;
date lastpay ;
};
اگرداشته باشیم
account x, y ;
بوسیله lastpay آنگاه عضو
x.lastpay.day
x.lastpay.month
x.lastpay.year
مشخص می گردد.

نکته :
می توان آرایه ای تعریف نمود که هر عضو آن یک ساختار باشد و حتی به آنها مقادیر اولیه تخصیص نمود.
struct struc1
{
char name[40];
int pay1;
int pay2;
} ;
struct cust[ ]= {nader, 3000 , 40000,
ali, 4200, 6000,
reza, 3700, 25000,
saman, 4800 , 2000, };

برنامه زیر هر عدد مختلط را بصورت یک ساختار در نظر گرفته، دو عدد مختلط را می گیرد و مجموع آنها را مشخص و نمایش می دهد.
#include <iostream.h>
int main( )
{
struct complex
{
float a;
float b;
} x, y, z;
cout << enter 2 complex numbers << endl ;
cin >> x.a>>x.b ;
cout << endl;
cin >> y.a >> y.b;
z.a = x.a + y.a ;
z.b = x.b + y.b ;
cout << endl << z.a <<  << z.b;
return 0 ;
}
x = a + ib i2= -1 بطوریکه
y = c + id
x+y =(a+c) + i(b+d)

اشاره گرها (Pointers)
داده هائی که در کامپیوتر در حافظه اصلی ذخیره میشوند بایت های متوالی از حافظه بسته به نوع data اشغال می کنند.

اشاره گرها (Pointers)
با داشتن آدرس داده در حافظه اصلی می توان براحتی به آن داده دسترسی پیدا نمود و از طرف دیگر آدرس هر داده در حافظه آدرس بایت شروع آن داده می باشد.
int x = 613;

نکته :
در کامپیوتر آدرس ها معمولاً دو بایت اشغال می نمایند. اگر آدرس x را در px قرار دهیم آنگاه می گوئیم که px به x اشاره می نماید.
px
x
آدرس متغیر x را بوسیله &x نشان میدهیم و عملگر & را عملگر آدرس می نامند.

int x , *px
px = &x ;

مثال :
int y , x , *px ;
x = 26 ;
px = &x ;
26
px
x
حال اگر دستور العمل x += 10 ; را بدهیم:
36
px
x
حال اگر دستورالعمل *px = *px + 7 ; بدهیم.
43
px
x

آرایه یک بعدی و اشاره گرها
اولین عنصر آرایه بوسیله x[0] مشخص می شود.
آدرس اولین عنصر آرایه بوسیله &x[0] یا بوسیله x مشخص می شود.
آدرس i امین عنصر آرایه بوسیله &x[i-1] یا بوسیله x(i-1) مشخص می شود.
دو دستورالعمل زیر با هم معادلند .
x[ i ] = 82.5 ;
*(x + i) = 82.5 ;
از طرف دیگر اگر داشته باشیم
float x[10];
float *p;
دو دستورالعمل زیر معادلند.
p = &x[2] ;
p= x + 2 ;

ساختارها و اشاره گرها
می توان اشاره گری را تعریف نمود که به اولین بایت یک ساختار (struct) اشاره نماید.
struct struc1
{
int a ;
float b ;
char c;
int d ;
} x, *px ;
px = &x ;
عبارت x.a معادل pxa معادل (*px).a می باشد.

در برنامه زیر یک آرایه 5 عنصری از نوع int ایجاد شده و مقادیر عناصر آرایه را به چهار طریق نمایش می دهد.
#include <iostream.h>
#include <conio.h>
int main( )
{
int x[ ]={12, 25, 6, 19, 100};
clrscr( );
int *px=x;
//نام آرایه بدون اندیس، اشاره به عنصر اول آرایه می نماید
for(int i=0; i<=4; i++)
cout << *(x+i) << endl;
//the second method
for(i=0; i<5; i++)
cout << x[ i ] <<  n;
//the third method
for(i=0; i<=4; i++)
cout << px[ i ]<<endl;
//the forth method
for(i=0; i<=4; i++)
cout << *(px+i)<<endl;
return 0; }

رشته ها و توابع مربوطه
رشته ها در C++ ، آرایه ای از کرکترها می باشند که با کرکتر   ختم میشوند.
char name[ ]=  sara;

رشته و اشاره گر
هر رشته از طریق اشاره گری به اولین کاراکتر آن در دسترس قرار می گیرد. آدرس یک رشته، آدرس کاراکتر اول آن می باشد. به رشته ها می توان مقدار اولیه تخصیص داد.
char *name =  sara;

برنامه ذیل پنج اسم را بصورت 5 رشته در نظر گرفته آنها را بترتیب حروف الفباء مرتب نموده نمایش می دهد.
#include <iostream.h>
#include <string.h>
void sort(char *[ ]);
int main( )
{
char *name[5] = {sara, afsaneh, babak, saman, naser };
sort(name);// display sorted strings
for(int i=0; i<5; ++i)
cout << name[ i ] << endl;
return 0;
}
void sort(char *name[ ])
{
char *t;
for(int i=0; i<4; ++i)
for(int j=i+1; j<5; ++j)
if(strcmpi(name[ i ], name[ j ]))> 0)
{// interchange the two strings
t= name[ j ];
name[ j ] = name[ i ];
name[ i ] = t ;
};

تابع strcmpi(s1, s2)
رشته های s1 و s2 را با هم مقایسه نموده (بدون توجه به حروف کوچک و بزرگ) اگر رشته s1 برابر با رشته s2 باشد مقدار صفر و اگر رشته s1 کوچکتر از رشته s2 باشد یک مقدار منفی در غیر اینصورت یک مقدار مثبت بر می گرداند.

تابع ) strcmp(s1, s2
رشته های s1 و s2 را با هم مقایسه نموده اگر s1 برابر با s2 باشد مقدار صفر و اگر رشته s1 کوچکتر از رشته s2 باشد یک مقدار منفی در غیر اینصورت یک مقدار مثبت برمی گرداند.

تابع ) strncmp(s1, s2,n
حداکثر n کرکتر از رشته s1 را با n کرکتر از رشته s2 مقایسه نموده در صورتیکه s1 کوچکتر از s2 باشد یک مقدار منفی، اگر s1 مساوی با s2 باشد مقدار صفر در غیر اینصورت یک مقدار مثبت برمیگرداند.

تابع (strcat(s1, s2
دو رشته s1 و s2 را بعنوان آرگومان گرفته رشته s2 را به انتهای رشته s1 اضافه می نماید. کرکتر اول رشته s2 روی کرکتر پایانی  رشته s1 نوشته می شود ونهایتاً رشته s1 را برمیگرداند.

تابع (strncat(s1, s2,n
دو رشته s1 و s2 ومقدار صحیح و مثبت n را بعنوان آرگومان گرفته، حداکثر n کرکتر از رشته s2 را در انتهای رشته s1 کپی می نماید. اولین کرکتر رشته s2 روی کرکتر پایانی  رشته s1 می نویسد ونهایتاً مقدار رشته s1 را برمیگرداند.

تابع (strlen(s
رشته s را بعنوان آرگومان گرفته طول رشته را مشخص می نماید.

تابع strcpy(s1,s2)
دو رشته s1 و s2 را بعنوان آرگومان گرفته رشته s2 را در رشته s1 کپی می نماید و نهایتاً مقدار رشته s1 را بر می گرداند.

تابع (strncpy(s1, s2,n
دو رشته s1 , s2 و مقدار صحیح و مثبت n را بعنوان آرگومان گرفته، حداکثر n کرکتر را از رشته s2 در رشته s1 کپی نموده، نهایتاً مقدار رشته s1 را برمیگرداند.

نکته مهم

برای استفاده از توابع مربوط به رشته ها بایستی حتماً در ابتدا برنامه #include <string.h> را قرار دهیم.

مثال :
#include <iostream.h>
#include <string.h>
#include <conio.h>
int main( )
{
char *s1= happy birthday;
char *s2= happy holidays ;
clrscr( );
cout << strcpy(s1, s2) << endl;
return 0;
}

مثال :
#include <iostream.h>
#include <string.h>
#include <conio.h>
int main( )
{
char *s = sara;
clrscr( );
cout << strlen(s);
return 0; }

تابع زیر معادل تابع کتابخانه strcmp می باشد.
int nikstrcmp(char s[] , char t[] )
{
int i=0;
while (s[i]==t[i] )
if ( s[i++]=‘’ )
return 0;
return (s[i]-t[i]);
}

برنامه نویس شی گرا

فهرست مطالب
تعریف شی گرایی
چند ریختی (polymorphism)
خاصیت ارث بری
پشته (stack)
ایجاد شی
ارث بری
سازنده ها و نابود کننده ها
توابع دوست
کلاس های دوست
توابع سازنده پارامتر دار
توابع سازنده یک پارامتری

عضوهای static
کلاسهای تودرتو
کلاس های محلی
استفاده از object ها بعنوان پارامترهای تابع
برگشت اشیاء
انتساب اشیاء
آرایه اشیاء
اشاره گر به اشیاء
اشاره گر this
توابع مجازی و پلی مرفیسم

تعریف شی گرایی
برنامه نویسی شئ گرا یا oop یک روش جدید برنامه نویسی می باشد که در آن از ویژگی ساخت یافته همراه با ویژگی های قوی جدید استفاده می شود. زبان برنامه نویسی C++ امکان استفاده از oop را به راحتی فراهم می نماید.

تعریف شی گرایی
در oop ، بطور کلی مساله به تعدادی زیرگروه قطعات مربوط به هم شکسته می شود که برای هر زیر گروه code و data تهیه شده و نهایتاً این زیرگروه ها تبدیل به unit ها یا واحدهائی می شود که objects (یا اشیاء) نامیده میشوند.

نکته مهم :
تمام زبانهای برنامه نویسی شی گرا دارای سه خصوصیت مشترک زیر می باشند :

الف: encapsulation (محصورسازی)
ب: polymorphism (چندریختی) ج:inheritance (ارث بری)

محصورسازی (Encapsulation )
محصورسازی مکانیزمی است که code و data را بهم وصل نموده و هر دوی آنها را از استفاده های غیرمجاز مصون نگه می دارد. شی یک مولفه منطقی است که data و code را محصور نموده و code باعث دستکاری و پردازش data می شود.

polymorphism (چند ریختی)
چند ریختی مشخصه ای است که بیک وسیله امکان میدهد که باتعدادی از سیستمها یا عمیات یا دستگاهها، مورد استفاده قرار گیرد.

inheritance (ارث بری)
ارث بری فرآیندی است که بوسیله آن یک شی (object) می تواند خاصیت های شی دیگری را دارا شود.

پشته (stack)
پشته ساختاری است که دارای خاصیت last in first out می باشد. پشته فضای پیوسته در حافظه اشغال می نماید. عملیاتی کــه روی پشته انجام می شوند عبارتند از :

الف: push، که باعث می شود یک عنصر وارد پشته شده.
ب: pop ، که باعث می شود یک عنصر از پشته خارج گردد.

ایجاد شی (object)
بمنظور ایجاد یک شی بایستی از کلمه رزروشده class استفاده نمود. class از نظر ظاهر شبیه ساختار یا struct می باشد. پشته را بعنوان یک object می توان در نظر گرفت که data آن شامل یک آرایه و یک tos ، و عملیاتی که روی این object انجام می شود عبارتست از push، initialize ، pop کردن پشته.
در اسلاید بعد مثالی از نحوه ایجاد شی آورده شده است.

مثال :
#define SIZE 100
// this creates the class stack.
class stack {
private :
int stck[SIZE];
int tos;
public:
void init( );
void push(int i);
int pop( );
};
بدین معنی است که stck و tos بوسیله توابعی که عضو object نباشند غیر قابل دسترسی هستند. و این یکی از روش های محصور سازی اقلام داده هاست.
بدین معنی است که بوسیله سایر قطعات برنامه قابل دسترسی می باشد.

نکته :
فقط توابع عضو می توانند به متغیرهای عضو از نوع private دسترسی داشته باشند. بایستی توجه داشت که اگر نوع عضوی مشخص نگردد آن عضو به صورت اتوماتیک private می باشد.
Private

نحوه تعریف تابع عضو یک کلاس
void stack : : push(int i)
{
if(tos = = SIZE ) {
cout << stack is full.;
return;
}
stck[tos]= i ;
tos ++ ;
}
عملگر: : مشخص می نماید که تابع متعلق به کدام object می باشد. عملگر : : عملگر scope resolution نامیده می شود.

برنامه کامل stack :
#include <iostream.h>
#define SIZE 100
// this creates the class stack.
class stack {
int stck[SIZE];
int tos;
public:
void init(int i);
int pop( );
void push(int i);
};
void stack : : init( )
{
tos = 0 ;
}
void stack : : push(int i)
{
if(tos = = size) {
cout << stack is full. ;
return ;
}
stck[tos] = i ;
tos ++ ;
}
int stack : : pop( )
{
if(tos = = 0) {
cout << stack underflow. ;
return 0 ; }
tos – – ;
return stck[tos];
}

int main( )
{
stack st1, st2; // create two objects
st1. init( );
st2.init( );
st1.push(1);
st2.push(2);
st1.push(3);
st2.push(4);
cout << st1.pop( ) << endl;
cout << st1.pop( ) << endl;
cout << st2. pop( ) << endl;
cout << st2. pop( ) << endl;
return 0; }

ارث بری
ارث بری فرآیندی است که بوسیله آن یک شی (object) می تواند خاصیت های شی دیگری را دارا شود.
در اسلاید بعد مثالی از ارث بری آورده شده است.

مثال :
در روبرو object ای بنام ساختمان یا building تعریف گردیده است. هر ساختمان دارای تعدادی اطاق، تعدادی طبقه و سطح زیر بنا نیز می باشد. از طرف دیگرتوابعی برای شی تعریف شده:
class building {
int rooms;
int floors;
int area;
public:
void set_rooms(int num);
int get_rooms( );
void set­_floors(int num);
int get_floors( );
void set_area(int num);
int get_area( );
};

حال object دیگری بنام house تعریف می نمائیم که نه تنها دارای تمام اعضای شی building می باشد بلکه دارای دو اقلام داده اضافی و چهار تابع اضافی می باشد. دراینجا عملاً شی house از شی building ارث می برد :
// house is derived from building
class house : public building {
int bedrooms;
int baths;
public:
void set_bedrooms(int num);
int get_bedrooms( );
void set_baths(int num);
int get_baths( );
};

نکته :
در مثال قبل building را base class و house را derived class می نامند. شی house تمام اعضای building را دارا است بعلاوه اینکه دارای متغیرهای عضوی اضافی bedrooms ، baths و همچنین توابع عضوی set_baths()، set_bebrooms()، get_baths()، get_bedrooms()نیز می باشد.
Inheritance

سازنده ها و نابودکننده ها (constructors and destructors)
Initialization یا مقدار اولیه دادن بصورت اتوماتیک از طریق تابعی انجام می شود بنام تابع constructor یا تابع سازنده. تابع سازنده تابع مخصوصی است که عضوی از کلاس بوده و همنام با کلاس می باشد.

سازنده ها و نابودکننده ها (constructors and destructors)
تابع نابود کننده یا destructor ، عکس عمل تابع سازنده را انجام می دهد. وقتی که شی ای از بین می رود بصورت اتوماتیک تابع نابود کننده آن فراخوانی می گردد.

توابع دوست (friend functions)
با استفاده از کلمه friend این امکان وجود دارد که به تابعی که عضو کلاس نمی باشد اجازه دسترسی به متغیرهای private کلاس را داد. برای آنکه تابعی را دوست اعلان نمائیم از کلمه friend قبل از تعریف تابع استفاده می نمائیم.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
#include <conio.h>
class myclass {
int a,b;
public :
friend int sum(myclass x);
void set_ab(int i, int j);
};
void myclass :: set_ab(int i, int j)
{
a=i;
b=j;
}
//sum is not a member function
int sum(myclass x)
{
return s.a + x.b;
}
int main( )
{
myclass n;
clrscr( );
n. set_ab(5,8);
cout << sum(n);
return 0 ;
}

نکته :

1-کلاسی که از کلاس دیگر ارث می برد ، توابع دوست آن کلاس را به ارث نمی برند. بعبارت دیگر یک derived class ، توابع دوست را به ارث نمی برد.

2-توابع دوست دارای مشخصه نوع ذخیره نمی باشند یعنی توابع دوست را نمی توان بصورت static یا external تعریف نمود.

کلاسهای دوست (friend classes)
این امکان وجود دارد که یک کلاس دوست کلاس دیگری باشد. در چنین وضعیتی تابع دوست به کلیه اسامی private تعریف شده در کلاس دیگر دسترسی دارد.
در اسلاید بعد مثالی آورده شده است.
Friend Class

#include <iostream.h>
class coins {
enum units {penny, nickel, dime, quarter, half_ dollar};
friend class amount;
};
class amount {
coins :: units money;
public:
void setm( );
int getm( );
} ob;
void amount :: setm( )
{
money = coins :: dime;
}
int amount :: getm( )
{
return money;
}
int main( )
{
ob.setm( );
cout << ob.getm( );
return 0 ;
}
مثال :

توابع سازنده پارامتردار
امکان انتقال آرگومانها به توابع سازنده وجود دارد. معمولاً از این آرگومانها برای initialize نمودن شی در زمان ایجاد آن استفاده میگردد.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
#include <conio.h>
class myclass {
int x, y;
public:
myclass(int i, int j) {x = i; y=j; }
void show( ) {cout << x << endl << y; }
};
int main( )
{
myclass obj( 3 , 5);
clrscr( );
obj.show( );
return 0;
}

توابع سازنده یک پارامتری
#include <iostream.h>
#include <conio.h>
class myclass{
int x;
public:
myclass(int i) {x=i;}
int getx( ) {return x;}
};
int main( )
{
clrscr( );
myclass obj=126; // منتقل کن i را به126
cout << obj.getx( );
return 0 ;
}

عضوهای static
اگر عضو داده ای بصورت static اعلان گردد این بدین معنی است که کامپیلر فقط یک کپی از متغیر مذکور را نگهداری نموده و تمام object ها بایستی بصورت اشتراکی از آن کپی استفاده نمایند. برای اینکار می بایستی از کلمه static قبل از اعلان عضو استفاده نمود.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
class shared{
static int a;
int b;
public :
void set (int i, int j) {a=i; b=j; }
void show( );
};
int shared :: a ; // define a
void shared :: show( )
{
cout << static a:  << a << endl;
cout << nonstatic b: << b << endl;
}
int main( )
{
shared x,y;
x.set(1,1); // set a to 1
x.show( );
y.set(4,4); // change a to 4
y.show( );
x.show( );
return 0;
}

nested classes (کلاسهای تودرتو)

می توان یک کلاس را در یک کلاس دیگر تعریف نمود. اما بعلت اینکه در C++ برای کلاسها خاصیت ارث بری وجود دارد نیازی معمولاً به تعریف نمودن یک کلاس در کلاس دیگر نیست
Nested Classes

local classes (کلاسهای محلی)

وقتی که کلاسی در درون یک تابع تعریف می شود این کلاس فقط برای آن تابع شناخته شده است و برای توابع دیگر ناشناخته می باشد. چنین کلاسی را کلاس محلی می نامند.
Local Classes

در مورد کلاسهای محلی رعایت نکات زیر ضروری است:
تمام توابع عضو بایستی در درون کلاس تعریف گردند.
از متغیرهای محلی، تابعی که کلاس در آن تعریف شده نمی تواند استفاده نماید.
از متغیرهای عضوی static نمی توان استفاده نمود.

استفاده ازobject ها بعنوان پارامترهای توابع
از object ها می توان بعنوان پارامترهای توابع استفاده نمود و مکانیزم انتقال آرگومانها و پارامترها بصورت call by value می باشد.

برگشت اشیاء (returning objects)
مقدار برگشتی یک تابع می تواند یک object باشد.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
class myclass {
int i ;
public :
void set_ i(int n) { i=n;}
int get_i( ) {return i;}
};
myclass funct( ); // return an object
int main( )
{
myclass ob;
ob=funct( );
cout << ob.get_i( ) << endl;
return 0;
}
myclass funct( )
{
myclass x ;
x.set_i(1);
return x;
}

انتساب اشیاء (object assignment)
در صورتیکه دو تا object از یک نوع باشند
می توان یک object را بدیگری انتساب نمود.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
#include <conio.h>
class myclass{
int i;
public:
void set_i(int n) {i=n;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob1, ob2;
obl.set_i(126);
ob2= ob1; // assign data from ob1 to ob2
clrscr( );
cout << ob2.get_i( );
retrun 0 ;
}

آرایه اشیاء (array of objects)
امکان استفاده از آرایه در مورد اشیاء می باشد.
بعبارت دیگر می توان در برنامه ها آرایه ای از object ها
داشته باشیم.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
#include <conio.h>
class myclass{
int i;
public:
void set_i(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
clrscr( );
myclass ob[3];
int i;
for(i=0; i<3; i++) ob[ i ].set_i(i+1);
for(i=0; i<3; i++)
cout << ob[ i ].get_i( ) << endl;
return 0;
}

اشاره گر به اشیاء (pointers to objects )
در مورد اشیاء نیز از اشاره گرها نیز می توان استفاده نمود.
از عملگر  در این مورد استفاده می شود.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
#include <conio.h>
class myclass{
int i ;
public:
myclass( ) {i=0;}
myclass(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob[3]= {1, 2, 3};
myclass *p;
int i;
p=ob; // get start of array
for(i=0; i<3; i++)
{
cout << p  get_i( ) << endl;
p++; // point to next object
}
return 0;
}

اشاره گر this (this pointer)
هر تابع عضو یک کلاس دارای یک پارامتر مخفی
بنام this pointer می باشد. this اشاره به object
خاصی می نماید.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
class pwr {
double b;
int e;
double val;
public:
pwr(double base, int exp);
double get_pwr( ) {return val;}
};
pwr :: pwr(double base, int exp)
{
this  b=base;
this  e=exp;
this  val =1;
if(exp = = 0) return;
for(; exp > 0 ; exp  )
this  val = this  val *this  b;
}
int main( )
{ pwr x(4.0, 2) , y(2.5, 1), z(5.7,0);
cout << x.get_pwr( ) <<  ;
cout << y.get_pwr( ) <<  ;
cout << z.get_pwr( ) <<  n ;
return 0;
}

توابع مجازی و پلی مرفیسم (virtual functions)

تابع مجازی، تابعی است که در base class تعریف شد و
بوسیله derived class تغیر داده میشود. برای اعلان یک
تابع مجازی بایستی از کلمه virtual استفاده نمائیم.
تغیر تابع در کلاس مشتق روی تابعی که در کلاس پایه (base class )
تعریف شده انجام می شود.
در اسلاید بعد مثالی آورده شده است.

مثال :
#include <iostream.h>
class base {
public :
virtual void vfunc( ){cout <<  this is base s vfunc( ) n ;}
};
class derived1 : public base {
public:
void vfunc( ) {cout <<  this is derived1 s vfunc( ) " << endl ; }
};
class derived2: public derived1 {
public:
/*vfunc( ) not overridden by derived2.In this case, since derived2 is derived
from derived1, derived1 s vfunc( ) is used */ } ;
int main( )
{
base *p, b;
derived1 d1;
derived2 d2;
//point to base
p = &b;
p  vfunc( ); // access base's vfunc
// point to derived1
p=&d1;
p  vfunc( ); //access derived1's vfunc( )
//point to derived2
p = &d2;
p  vfunc( ); // use derived1 s vfunc( )
return 0 ; }

keywords and alternative tokens.


تعداد صفحات : 80 | فرمت فایل : pptx

بلافاصله بعد از پرداخت لینک دانلود فعال می شود