PDA

View Full Version : دلیل استفاده از اشاره گر از نوع کلاس



mohamad1370
جمعه 16 فروردین 1392, 17:52 عصر
سلام
چرا تووی برنامه ها اصولاْ اشاره گرهایی از نوع کلاس تعریف میشه ی

class myclass{

.
.
.

}

myclass m
myclass *m

تفاوت این دوتا چیه و اصلاْ تعریف نوع دوم مزایایی نسبت به نوع اول داره تووی سورس کد خیلی از برنامه ها دیدم از حالت دوم زیاد استفاده میشه تووی Qt هم اینجور تعاریف رو زیاد دیدم .
از کدوم استفاده بشه بهتره ؟
بحثم سر محتویات داخل کلاس نیست که ممکنه مثلاْ یه تابع تووی کلاس شرایطی رو پیش بیاره که حتماْ باید از اشاره گر استفاده کنیم فرض رو بر این بگیرید که واسه یک کلاس هر دو تعریف رو بشه بکار برد.

مسعود اقدسی فام
جمعه 16 فروردین 1392, 21:54 عصر
وقتی از اشاره‌گر استفاده می‌کنید به جای اینکه یه کپی از کل کلاس به صورت پارامتر به تابع ارسال بشه (که ممکنه چند ده یا چند صد بایت بشه) فقط آدرس شروع کلاس در حافظه (در حد چند بایت) به تابع ارسال می‌شه. در نتیجه سرعت پردازش اطلاعات بالاتر می‌ره. البته اگه لازم باشه که داخل تابع مقادیر کلاس عوض بشه چاره‌ای جز اشاره‌گر یا متغیر مرجع وجود نداره.

این لینک رو هم مطالعه کنید:


http://www.algorithmha.ir/post-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C-%D9%85%D8%B1%D8%AC%D8%B9-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx

http://www.algorithmha.ir/post-%D8%A7%D8%B4%D8%A7%D8%B1%D9%87-%DA%AF%D8%B1-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx

mohamad1370
شنبه 24 فروردین 1392, 16:13 عصر
در کل این روش معایبی هم داره و بهتره همیشه در صورتی که مجبور نیستیم از کدوم روش استفاده کنیم ؟
درکل چه موقعی کلاس رو به صورت اشاره گر و چه موقعی به صورت عادی تعریف کنیم ؟
یه چیزی دیگه بیشتر مواقع تووی برنامه های دیگه دیدم که از یک کلاس به صورت پویا شی ساخته میشه و بعد مجبوریم خودمون اونو deleteکنیم چرا ؟

بابک.م.
شنبه 24 فروردین 1392, 16:40 عصر
ظاهرا سوال شما بطور کلی در مورد تخصیص حافظه است.
کلا دو نوع تخصیص حافظه وجود داره: static و Dynamic

static: در این روش تخصیص حافظه بطور خودکار صورت می گیرد و بطور خودکار آزاد می شود. متغییر های local درون توابع و متغییر های global به این دسته تعلق دارند.

dynamic: در این روش تخصیص حافظه توسط برنامه نویس صورت می گیرد و توسط او نیز حذف می شود (malloc-new/delete). در صورت فراموش کردن عمل حذف ، حافظه همچنان در اختیار برنامه باقی مانده و اصطلاحا memory leak اتفاق می افتد. مزیت این روش کنترل برنامه نویس بر زمان زندگی متغییر و امکان آزاد سازی آن است. در ضمن مواردی که حجم حافظه مورد نیاز متغییر است مثل linked list از dynamic memory allocation استفاده می شود.

saina2006
شنبه 24 فروردین 1392, 17:06 عصر
شما اگر به صورت pointer کلاس را تعریف کنید نمیتونید ازش استفاده کنید مگر اینکه آدرس یک کلاس رو بهش بدید، برای مثال:

class myclass{

void add()
{
};


}

myclass m;
myclass *b;

b = &m;
m.add();
b->add();

شما در واقع b رو تعریف نکردید، میشه گفت شما به m یک نام دیگه به نام b دادید.

aidinMC
شنبه 24 فروردین 1392, 21:22 عصر
البته اشاره گر فقط برای کلاس نیست
و در کل اگه شما حرفه ای باشی فقط باید با اشاره گر کار کنی چون سی پلاس مدیریت حافظه رو به برنامه نویس واگذار کرده و مثل سی شارپ اتوماتیک تنظیم نمیکنه
اگه میخوای برنامه نویس خوب باشی حتما تو اشاره گرها خودتو قوی کن چون نفس سی پلاس = اشاره گر
موفق باشی

mohamad1370
یک شنبه 25 فروردین 1392, 00:29 صبح
ممنون دوستان
در مورد کار با اشاره گره ها تا حدود زیادی باهاشون آشنایی دارم .در مورد تخصیص حافظه هم اطلاعات تقریبا کاملی دارم .
#include<iostream>

using namespace std;

class myclass {
public:
void f()
{
cout << "myclass" << endl;
}
};


int main()
{
myclass a;
myclass *b = new myclass ;
a.f();
b->f();
delete [] b ;
return 0;
}
بزارید یه جور دیگه سوالم رو بپرسم این دوتا شیی که من ساختم تفاوتشون چیه ؟کدوم یکی بهتره ؟تووی برنامه نویسی حرفه ایی کدوم یکی مطرحه ؟
میدونم اولی اگه حافظه ایی اختصاص داده بشه آزاد کردنش میفته دست سیستم عامل ولی دومی دست خودمونه و راههای زایادی برای آزاد کردنش هست.یه چیزایی هم دوستمون آقای اقدسی گفتند .ولی فواید دیگه اش چیه ؟
ممنون میشم دلیل و منبع دلایل توون رو ذکر کنید .

مسعود اقدسی فام
یک شنبه 25 فروردین 1392, 00:47 صبح
ممنون دوستان
در مورد کار با اشاره گره ها تا حدود زیادی باهاشون آشنایی دارم .در مورد تخصیص حافظه هم اطلاعات تقریبا کاملی دارم .
#include<iostream>

using namespace std;

class myclass {
public:
void f()
{
cout << "myclass" << endl;
}
};


int main()
{
myclass a;
myclass *b = new myclass ;
a.f();
b->f();
delete [] b ;
return 0;
}
بزارید یه جور دیگه سوالم رو بپرسم این دوتا شیی که من ساختم تفاوتشون چیه ؟کدوم یکی بهتره ؟تووی برنامه نویسی حرفه ایی کدوم یکی مطرحه ؟
میدونم اولی اگه حافظه ایی اختصاص داده بشه آزاد کردنش میفته دست سیستم عامل ولی دومی دست خودمونه و راههای زایادی برای آزاد کردنش هست.یه چیزایی هم دوستمون آقای اقدسی گفتند .ولی فواید دیگه اش چیه ؟
ممنون میشم دلیل و منبع دلایل توون رو ذکر کنید .

اگه بحثتون مزیت اشاره‌گر به کلاس به جای یه شی از خود کلاس باشه، که خب گفتم بزرگترین مزیتش بحث مدیریت بهتر حافظه در زمان انتقال به توابع هستش.

هر مزیت دیگه‌ای که وجود داشته باشه بر می‌گرده به مزیت کلی مفهوم اشاره‌گر. اینکه مثلا وقتی یه آدرس رو به یه تابع ارسال می‌کنید، با تغییر محتوای آدرس، متغیر تابع اصلی هم مقدارش عوض می‌شه.

گاهی برای تغییرات فیلدهای کلاس‌های حتما باید به صورت اشاره‌گر یا مرجع ارسال بشن.