PDA

View Full Version : سوال: تفاوت متود استاتیک یک کلاس با سایر متد ها از نظر تخصیص حافظه



khorzu
چهارشنبه 24 شهریور 1389, 16:03 عصر
سلام
علاوه بر سوال بالا می خواستم بدونم دستورات متد های غیر استاتیک به ازای هر نمونه از کلاس کپی می شند ؟

PC2st
چهارشنبه 24 شهریور 1389, 17:08 عصر
در سی++ بجای متود (Method) از اصطلاح «تابع عضو (Member function)» استفاده می‌شود.

تنها تفاوتی که تابع عضو غیر استاتیک (متود غیر استاتیک) با تابع عضو استاتیک (متد استاتیک) دارد در این است که تابع عضو غیر استاتیک بطور ضمنی یک آرگومان اضافه‌تر دارد (بدون دخالت برنامه‌نویس).



class X
{
public:
void xxx();
static void yyy();
};
تابع xxx و yyy توسط کامپایلر بصورت زیر مورد استفاده قرار می‌گیرند:

void xxx(X* this);
void yyy();و در تابع xxx برنامه‌نویس توسط کلمهٔ کلیدی this به پارامتر اول دسترسی دارد که همان شیئ کلاس است. بنابراین در بدنهٔ تابع xxx (که غیر استاتیک است) می‌توان از شیئ this استفاده کرد اما در تابع yyy (که استاتیک است) نمی‌توان.

در کل، توابع عضو غیر استاتیک و توابع عضو استاتیک و توابع غیر عضو (global) همگی به یک صورت هستند و هیچیک به لحاظ overhead (سربار اضافه) نسبت به دیگری برتری ندارند.


علاوه بر سوال بالا می خواستم بدونم دستورات متد های غیر استاتیک به ازای هر نمونه از کلاس کپی می شند ؟ با توجه به توضیح بالا، جواب منفی است. با توجه به مثال قبل، برنامه‌نویس توسط کلمهٔ کلیدی this در تابع xxx می‌تواند به شیئ کلاس دسترسی داشته باشد، در نتیجه آن چیزی که به ازای هر نمونه از کلاس ایجاد می‌شود، پارامتر اول با نام this است ولی تابع عضو غیر استاتیک، همواره یکی است (به این خاطر است که به لحاظ کارآیی، استفاده از توابع عضو هیچگونه اثر مخربی ندارند).

khorzu
چهارشنبه 24 شهریور 1389, 17:34 عصر
ممنون.
می شه درمورد تفاوت بکار بردن یا نبردن this پشت اعضای یک کلاس میان دستورات «تابع عضو (Member function)» هم توضیح بدید .

PC2st
چهارشنبه 24 شهریور 1389, 18:01 عصر
می شه درمورد تفاوت بکار بردن یا نبردن this پشت اعضای یک کلاس میان دستورات «تابع عضو (Member function)» هم توضیح بدید . در بدنهٔ «توابع عضو» می‌توان بطور ضمنی به اعضای کلاس دسترسی داشت. در صورت استفاده از this، بطور صریح برای کامپایلر مشخص می‌شود که دسترسی به «متغیر عضو» مد نظر بوده است نه «متغیر محلی»:



class X
{
int xxx;

public:

int abc()
{
int xxx = 5;
this->xxx = 10; //xxx value is still 5
return xxx; //returns 5
}
};

Salar Ashgi
پنج شنبه 25 شهریور 1389, 01:13 صبح
this یک اشاره گری است که به آبجکت فعلی کلاس (در حال فراخوانی ) اشاره میکند !
همانطور که میدانیم در ارجاع به آبجکت و اشاره گر به آبجکت ، جهت دسترسی به توابع عضو باید از
عملگر <- استفاده شود ./
یه مثال ساده نوشتم واسه واضحتر شدن مساله :



#include <iostream>
#include <conio>
class A{
private:
int x;
public:
A(){x=0;}
A(int a){x=a;}
A Square();
A Cube();
void print(){cout<<x<<endl;}
};
//=============
A A::Square(){
A obj;
obj.x = (this->x * this->x);
return obj;}
//=============
A A::Cube(){
A obj;
obj.x = ((*this).x * (*this).x * (*this).x);
return obj;}
//=============
int main(){
A obj1(6);
obj1.Square().print();//out =36;
obj1.Cube().print();//out = 216
getch();
}