سلام
علاوه بر سوال بالا می خواستم بدونم دستورات متد های غیر استاتیک به ازای هر نمونه از کلاس کپی می شند ؟
سلام
علاوه بر سوال بالا می خواستم بدونم دستورات متد های غیر استاتیک به ازای هر نمونه از کلاس کپی می شند ؟
در سی++ بجای متود (Method) از اصطلاح «تابع عضو (Member function)» استفاده میشود.
تنها تفاوتی که تابع عضو غیر استاتیک (متود غیر استاتیک) با تابع عضو استاتیک (متد استاتیک) دارد در این است که تابع عضو غیر استاتیک بطور ضمنی یک آرگومان اضافهتر دارد (بدون دخالت برنامهنویس).
تابع xxx و yyy توسط کامپایلر بصورت زیر مورد استفاده قرار میگیرند:
class X
{
public:
void xxx();
static void yyy();
};
void xxx(X* this);و در تابع xxx برنامهنویس توسط کلمهٔ کلیدی this به پارامتر اول دسترسی دارد که همان شیئ کلاس است. بنابراین در بدنهٔ تابع xxx (که غیر استاتیک است) میتوان از شیئ this استفاده کرد اما در تابع yyy (که استاتیک است) نمیتوان.
void yyy();
در کل، توابع عضو غیر استاتیک و توابع عضو استاتیک و توابع غیر عضو (global) همگی به یک صورت هستند و هیچیک به لحاظ overhead (سربار اضافه) نسبت به دیگری برتری ندارند.
با توجه به توضیح بالا، جواب منفی است. با توجه به مثال قبل، برنامهنویس توسط کلمهٔ کلیدی this در تابع xxx میتواند به شیئ کلاس دسترسی داشته باشد، در نتیجه آن چیزی که به ازای هر نمونه از کلاس ایجاد میشود، پارامتر اول با نام this است ولی تابع عضو غیر استاتیک، همواره یکی است (به این خاطر است که به لحاظ کارآیی، استفاده از توابع عضو هیچگونه اثر مخربی ندارند).علاوه بر سوال بالا می خواستم بدونم دستورات متد های غیر استاتیک به ازای هر نمونه از کلاس کپی می شند ؟
ممنون.
می شه درمورد تفاوت بکار بردن یا نبردن this پشت اعضای یک کلاس میان دستورات «تابع عضو (Member function)» هم توضیح بدید .
در بدنهٔ «توابع عضو» میتوان بطور ضمنی به اعضای کلاس دسترسی داشت. در صورت استفاده از this، بطور صریح برای کامپایلر مشخص میشود که دسترسی به «متغیر عضو» مد نظر بوده است نه «متغیر محلی»:می شه درمورد تفاوت بکار بردن یا نبردن this پشت اعضای یک کلاس میان دستورات «تابع عضو (Member function)» هم توضیح بدید .
class X
{
int xxx;
public:
int abc()
{
int xxx = 5;
this->xxx = 10; //xxx value is still 5
return xxx; //returns 5
}
};
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();
}