PDA

View Full Version : سوال: اشاره گرها در کیوت و سی پلاس پلاس؟



sd.CSharpProgrammer
پنج شنبه 26 آبان 1390, 16:23 عصر
سلام دوستان

من تا الان سی شارپ کار میکردم ولی به این نتیجه رسیدم که برم سراغ سی پلاس پلاس و بویژه کیوت!
ولی همیشه تو مبحث اشاره گرها ابهاماتی داشتم که هیچوت هیچ منبعی نتونسته اونا رو رفع کنه. با توجه به اینکه در کیوت از اشاره گرها به وفور استفاده میشه خواهش میکنم به سوالاتم پاسخ بدین تا بتونم یادگیری کیوت رو شروع کنم.

1) چرا بعضی جاها از * استفاده میشه و بعضی جاها نه؟! ما از کجا باید تشخیص بدیم کجا ازش استفاده کنیم؟ تو سایت یه چندتا تاپیک در مورد این مساله بود که اتفاقاً تو بعضی ها شما هم جواب داده بودین ولی با خوندنشون به نتیجه نرسیدم!!

2) من آخرش نفهمیدم برای استفاده از اعضای یک کلاس (متغیرها، توابع عضو و ...) باید از نقطه استفاده کرد یا :: یا <- ؟؟؟؟؟ این مساله برام کمی گیج کننده است! :گیج:
مثال زیر رو ببینید :


#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QPushButton *button = new QPushButton("Quit");

QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));

button->show();

return app.exec();
}



تو مثال بالا متد connect با عملگر :: فراخوانی شده ولی متد show با عملگر <- !!!!! برای نقطه هم همچین مواردی هست.

3) مگه تو سی پلاس پلاس وقتی با new یه آبجکت میسازیم نباید آخرش با delete اون شی رو از بین ببریم؟! چرا تو مثال بالا (و تقریباً همه سورسهای کیوتی که دیدم) آبجکت button بصورت دستی تخریب نشده؟!

4) و سوال آخر : در بعضی جاها پارامتری از یک متد بصورت اشاره گر تعریف شده ولی بعضی وقتها متغیری رو بصورت & بهش پاس میدن بعضی جاها معمولی. دلیلش چیه؟! فکر کنم قضیه reference values باشه، درست حدس زدم؟!

glassysmart
پنج شنبه 26 آبان 1390, 17:29 عصر
سلام
خوب بهتر بود قبل از سی شارپ با سی پلاس پلاس آشنایی کامل پیدا میکردید
1- در موقع تعریف علامت * مشخص می کند که متغییر تعریف شده یک نگه دارنده آدرس از آن نوع کلاس است اما در غیر این صورت به معنی مقدار موجود در آن متغییر حافظه را دارد
2-اگر که با اشاره گر کاربکنید دو راه زیر را دارید

object -> metod()

(object *).metod()
اگر با اشاره گر کار نکنید

object .metod()

اما :: یکی هنگام تعریف اعضای کلاس بیرون از کلاس کاربرد دارد که خواهید دید و دیگری آنکه متد مذبور از نوع static است مثل connect
3- زیاد تو این سطح حساس نباشید
4- >2

sd.CSharpProgrammer
جمعه 27 آبان 1390, 09:25 صبح
1- در موقع تعریف علامت * مشخص می کند که متغییر تعریف شده یک نگه دارنده آدرس از آن نوع کلاس است اما در غیر این صورت به معنی مقدار موجود در آن متغییر حافظه را دارد


سلام دوست عزیز
این درست، من اشاره گرها رو میدونم. سوال من این بود که از کجا تشخیص بدیم کی ازشون استفاده کنیم کی نه؟!

ممنون بابت راهنمائی های خوبتون.

alamate_aoal
جمعه 27 آبان 1390, 10:45 صبح
سوال من این بود که از کجا تشخیص بدیم کی ازشون استفاده کنیم کی نه؟!

هر وقت خواستی به اعضای داده و متدهای یک کلاس از طریق یک اشاره گر دسترسی پیدا کنی از عملگر فلش (<-) استفاده کن , در غیر اینصورت از عملگر نقطه




مگه تو سی پلاس پلاس وقتی با new یه آبجکت میسازیم نباید آخرش با delete اون شی رو از بین ببریم؟! چرا تو مثال بالا (و تقریباً همه سورسهای کیوتی که دیدم) آبجکت button بصورت دستی تخریب نشده؟!

در کیوتی هر وقت یه شیئی بسازید و برای اون Parent مشخص کنید , شی والد ,شی فرزند رو در موقع تخریب خودش delete میکنه(یعنی وظیفه delete کردن گردن باباهه هست)
این مثال شما یه تیکه برنامه ی کوچیکه و بعد از پایان اجراش , سیستم عامل حافظه رو آزاد میکنه




در بعضی جاها پارامتری از یک متد بصورت اشاره گر تعریف شده ولی بعضی وقتها متغیری رو بصورت & بهش پاس میدن بعضی جاها معمولی. دلیلش چیه؟!

زمانیکه پارامتر یک تابع اشاره گر است , باید آرگومان متناظرش اشاره گر باشه , اگه نبود با عملگر آدرس ساز(&) آدرس اون رو میسازیم.

ayub_coder
دوشنبه 24 بهمن 1390, 09:17 صبح
منم همین مشکل رو دارم.
مثلا چه اتفاقی می افتاد اگه این
QPushButton *button = new QPushButton("Quit");

بدون استفاده از اشاره گر تعریف میشد؟
به این شکل

QPushButton button("Quit");

؟:متفکر:
همانطور که دورتمون گفتن میشه مطلب رو باز کنید که چرا از اشاره استفاده می کنیم؟ چه ضرورتی داره اگه میشه ازش استفاده نکرد و به نتیجه رسید؟ :گیج:

alamate_aoal
دوشنبه 24 بهمن 1390, 13:27 عصر
همه قدرت و انعطاف زبان های خانواده c به واسطه اشاره گرهاست

هنگامیکه شیئی رو از طریق عملگر new میسازید حافظه اون از heap تخصیص پیدا میکنه یعنی بعد از اجرای روال یا تابع اون شئ به هیچ وجه از بین نمیره مگر اینکه شما اونو delete کنید
در صورتیکه شما از فرم زیر استفاده کنید , با توجه باینکه حافظه از روی استک تخصیص داده میشه به محض خارج شدن شئ از دید , شئ مزبور بطور خودکار delete میشه

QPushButton button("Quit");

ayub_coder
دوشنبه 24 بهمن 1390, 13:52 عصر
مطلب بسیار مفیدی بود
پس مستقیم بر میگرده به طول عمر اشیائی که در برنامه استفاده میشه درست فهمیدم؟:اشتباه:
اگه از روش پوینتر استفاده نکنیم با پایان یافتن بلاک متغییر از حافظه خارج میشه.!! ؟ ولی با اشاره گر تا زمانی که فری نکنیم این عمل انجام نمیشه.!!!؟ درست متوجه شدم؟

alamate_aoal
دوشنبه 24 بهمن 1390, 14:08 عصر
بله درست می فرمایید