SlideShare a Scribd company logo
1 of 118
‫خدا‬ ‫نام‬ ‫به‬
‫به‬ ‫پیشرفته‬ ‫نویسی‬ ‫برنامه‬ ‫بر‬ ‫مروری‬
‫دیگر‬ ‫زبانی‬
‫در‬ ‫مقدماتی‬ ‫گرایی‬ ‫شی‬ ‫آموزش‬C++
‫کننده‬ ‫تهیه‬:‫محسنی‬ ‫محمدرضا‬
‫چرا‬C++‫؟‬
•‫افزار‬ ‫سخت‬ ‫نویسی‬ ‫برنامه‬:‫زبان‬ ‫بودن‬ ‫نزدیکتر‬ ‫علت‬ ‫به‬C++
‫پایین‬ ‫سطح‬ ‫نویسی‬ ‫برنامه‬ ‫برای‬ ‫غالبا‬ ،‫افزار‬ ‫سخت‬ ‫زبان‬ ‫به‬
(‫درایورها‬ ‫نوشتن‬ ‫مانند‬)‫شود‬ ‫می‬ ‫استفاده‬ ‫زبان‬ ‫این‬ ‫از‬.
•‫باال‬ ‫قدرت‬:‫زبان‬ ‫که‬ ‫آنجا‬ ‫از‬C++‫اشاره‬ ‫مانند‬ ‫هایی‬ ‫قابلیت‬
‫را‬ ‫کارها‬ ‫از‬ ‫بسیاری‬ ‫انجام‬ ،‫دارد‬ ‫را‬ ‫حافظه‬ ‫مدیریت‬ ‫و‬ ‫گرها‬
‫میکند‬ ‫ممکن‬.
•‫باال‬ ‫سرعت‬:‫کدهای‬C++‫پایتون‬ ‫و‬ ‫جاوا‬ ‫کدهای‬ ‫از‬ ‫سریعتر‬
‫هستند‬.‫که‬ ‫کنید‬ ‫می‬ ‫مشاهده‬ ‫بعد‬ ‫صفحه‬ ‫جدول‬ ‫در‬ ‫مثال‬ ‫برای‬
‫زبان‬ ‫دو‬ ‫در‬ ‫یکسان‬ ‫کد‬ ‫دو‬C++‫زمان‬ ‫اختالف‬ ‫مقدار‬ ‫چه‬ ‫جاوا‬ ‫و‬
‫داشته‬ ‫اجرا‬:
•‫کار‬ ‫بازار‬ ‫در‬ ‫باال‬ ‫درآمد‬:‫حقوق‬ ‫معموال‬ ،‫شرکت‬ ‫یک‬ ‫در‬
‫نویس‬ ‫برنامه‬C++‫دیگر‬ ‫زبانهای‬ ‫نویسان‬ ‫برنامه‬ ‫حقوق‬ ‫از‬
‫است‬ ‫بیشتر‬( .‫باشد‬ ‫می‬ ‫نویسان‬ ‫برنامه‬ ‫بین‬ ‫صرفا‬ ‫مقایسه‬)
‫ب‬ ‫را‬ ‫جدید‬ ‫قابلیتهای‬ ‫برخی‬ ‫و‬ ‫اید‬ ‫آموخته‬ ‫جاوا‬ ‫در‬ ‫که‬ ‫را‬ ‫زیر‬ ‫موارد‬ ‫شما‬ ‫جلسه‬ ‫این‬ ‫در‬‫ه‬
‫زبان‬C++‫بینید‬ ‫می‬ ‫نیز‬:
•‫بر‬ ‫مروری‬‫گر‬ ‫اشاره‬‫پویا‬ ‫حافظه‬ ‫تخصیص‬ ‫و‬ ‫ها‬
•‫کالسها‬ ‫نوشتن‬‫آن‬ ‫توابع‬ ‫و‬ ‫متغیرها‬ ‫تعریف‬ ‫و‬
•‫صورت‬ ‫به‬ ‫ها‬ ‫داده‬ ‫تعریف‬Public‫و‬Private‫و‬Protected‫دسترسی‬ ‫سطح‬ ‫و‬
‫هرکدام‬
•‫فراخوانی‬ ‫و‬ ‫نوشتن‬‫سازنده‬‫و‬ ‫ها‬‫مخرب‬‫پوینتر‬ ‫با‬ ‫کردن‬ ‫کار‬ ‫و‬ ‫ها‬this
•‫با‬ ‫کردن‬ ‫کار‬ ‫و‬ ‫ساختن‬ ‫نحوه‬‫کالس‬ ‫از‬ ‫متغیری‬‫ایم‬ ‫کرده‬ ‫تعریف‬ ‫که‬ ‫ی‬.
•‫ارثبری‬‫یکدیگر‬ ‫از‬ ‫کالسها‬(‫چندگانه‬ ‫و‬ ‫یگانه‬)
•‫مورفیسم‬ ‫پلی‬‫توابع‬ ‫و‬‫مجازی‬
•‫استاتیک‬‫و‬‫نمونه‬
•‫مفهوم‬‫دوستی‬(‫کالسها‬ ‫و‬ ‫توابع‬)
•‫گرها‬ ‫اشاره‬(‫ادامه‬)
•‫با‬ ‫کار‬‫فایل‬‫ها‬
•‫تعریف‬ ‫فضاهای‬Namespace
•‫ماکروها‬Preprocessor Directives
•‫داده‬ ‫دیگر‬ ‫انواع‬
•‫سربارگذاری‬‫اپراتورها‬(Operator Overloading)
•‫ها‬ ‫قالب‬Templates
‫گر‬ ‫اشاره‬ ‫بر‬ ‫مروری‬
‫متغیر‬ ‫گر‬ ‫اشاره‬ ،‫اید‬ ‫آموخته‬ ‫نویسی‬ ‫برنامه‬ ‫و‬ ‫کامپیوتر‬ ‫مبانی‬ ‫درس‬ ‫در‬ ‫که‬ ‫همانطور‬‫ی‬
‫میکند‬ ‫اشاره‬ ‫حافظه‬ ‫از‬ ‫ای‬ ‫خانه‬ ‫به‬ ‫که‬ ‫است‬.‫اپراتور‬ ‫دو‬ ‫با‬ ‫مبانی‬ ‫در‬‘&’‫و‬‘*’،‫شدید‬ ‫آشنا‬
‫از‬ ‫خانه‬ ‫آن‬ ‫در‬ ‫موجود‬ ‫مقدار‬ ‫دیگری‬ ‫و‬ ‫دهد‬ ‫می‬ ‫ما‬ ‫به‬ ‫را‬ ‫حافظه‬ ‫در‬ ‫متغیر‬ ‫آدرس‬ ‫اولی‬ ‫که‬
‫دهد‬ ‫می‬ ‫ما‬ ‫به‬ ‫را‬ ‫میکند‬ ‫اشاره‬ ‫آن‬ ‫به‬ ‫گر‬ ‫اشاره‬ ‫که‬ ،‫حافظه‬.
‫میکنیم‬ ‫مرور‬ ‫هم‬ ‫با‬ ‫را‬ ‫زیر‬ ‫نکات‬ ‫یادآوری‬ ‫برای‬:
•‫متغیر‬ ‫اگر‬A‫جنس‬ ‫از‬*Data،‫باشد‬&A‫جنس‬ ‫از‬ ‫متغیری‬Data**‫و‬*A‫از‬ ‫متغیری‬
‫جنس‬Data‫بود‬ ‫خواهد‬.
•‫جنس‬ ‫از‬ ‫آن‬ ‫عناصر‬ ‫که‬ ‫ای‬ ‫آرایه‬Data‫جنس‬ ‫از‬ ‫ثابتی‬ ‫گر‬ ‫اشاره‬ ‫خود‬ ،‫میباشند‬Data*
‫میباشد‬.
•‫کنید‬ ‫فرض‬A‫جنس‬ ‫از‬ ‫متغیری‬Data‫داریم‬ ‫قصد‬ ‫و‬ ‫میباشد‬B‫کنیم‬ ‫تعریف‬ ‫گری‬ ‫اشاره‬ ‫را‬
‫متغیر‬ ‫به‬ ‫که‬A‫میکند‬ ‫اشاره‬:
Data* B = &A;
‫متغیر‬ ‫آدرس‬ ‫فوق‬ ‫دستور‬ ‫در‬A‫در‬B‫میشود‬ ‫ریخته‬.‫از‬ ‫استفاده‬ ‫با‬ ،‫کد‬ ‫دیگر‬ ‫قسمتهای‬ ‫در‬
‫عملگر‬*‫مقدار‬ ‫به‬ ‫میتوان‬A‫کرد‬ ‫پیدا‬ ‫دسترسی‬.
‫پویا‬ ‫حافظه‬ ‫تخصیص‬
‫زبان‬ ‫در‬ ‫میدانید‬ ‫که‬ ‫همانطور‬C++‫جای‬ ‫به‬ ‫میتوان‬ ‫ها‬ ‫آرایه‬ ‫مانند‬ ‫حجیم‬ ‫های‬ ‫داده‬ ‫برای‬
Stack‫روی‬ ‫بر‬Heap‫گرفت‬ ‫فضا‬.‫دستور‬ ‫توسط‬ ‫کار‬ ‫این‬new‫میشود‬ ‫انجام‬.‫زیر‬ ‫کد‬ ‫در‬
‫کنید‬ ‫مشاهده‬ ‫را‬ ‫مورد‬ ‫این‬ ‫از‬ ‫مثال‬ ‫یک‬ ‫میتوانید‬:
int a[20]; //Memory allocated on Stack
int* a = new int[20]; //Memory allocated on Heap
‫روی‬ ‫بر‬ ‫ها‬ ‫آرایه‬ ‫تعریف‬ ‫مزایای‬ ‫از‬ ‫یکی‬Heap‫تعریف‬ ‫متغیر‬ ‫را‬ ‫آن‬ ‫طول‬ ‫میتوان‬ ‫که‬ ‫است‬ ‫این‬
‫کرد‬.‫روی‬ ‫بر‬ ‫شده‬ ‫تعریف‬ ‫آرایه‬ ‫اما‬Stack‫مقدار‬ ‫یک‬ ‫همواره‬const‫خود‬ ‫طول‬ ‫عنوان‬ ‫به‬ ‫را‬
‫پذیرد‬ ‫می‬.‫روی‬ ‫بر‬ ‫متغیر‬ ‫طول‬ ‫با‬ ‫زیر‬ ‫آرایه‬ ‫مثال‬Heap‫است‬ ‫شده‬ ‫تعریف‬:
int n;
cin >> n;
int* a = new int[n];
‫عملگر‬ ‫واسطه‬ ‫به‬ ‫میتوان‬ ‫را‬ ‫شده‬ ‫داده‬ ‫تخصیص‬ ‫حافظه‬delete[]‫ساخت‬ ‫آزاد‬.
‫ش‬ ‫پاک‬ ‫حافظه‬ ‫یا‬ ‫و‬ ‫شود‬ ‫آزاد‬ ‫پوینتر‬ ‫یک‬ ‫برای‬ ‫داده‬ ‫اختصاص‬ ‫حافظه‬ ‫برنامه‬ ‫طول‬ ‫در‬ ‫اگر‬،‫ود‬
‫معلق‬ ‫گر‬ ‫اشاره‬ ،‫پوینتر‬ ‫آن‬ ‫به‬(Dangling Pointer)‫میگویند‬.
‫روی‬ ‫بر‬ ‫را‬ ‫ها‬ ‫داده‬ ‫مواقعی‬ ‫چه‬ ‫است‬ ‫این‬ ‫مهم‬ ‫سوال‬ ‫اما‬Stack‫بر‬ ‫مواقعی‬ ‫چه‬ ‫و‬
‫روی‬Heap‫کنیم؟‬ ‫ذخیره‬
‫شویم‬ ‫آشنا‬ ‫دو‬ ‫این‬ ‫های‬ ‫ویژگی‬ ‫با‬ ‫کمی‬ ‫است‬ ‫بهتر‬ ‫سوال‬ ‫این‬ ‫پاسخ‬ ‫عنوان‬ ‫به‬:
•Stack‫محدود‬ ‫بسیار‬ ‫ای‬ ‫حافظه‬(‫کیلوبایت‬ ‫هزار‬ ‫چند‬ ‫حد‬ ‫در‬)‫باشد‬ ‫می‬.‫در‬
‫شدن‬ ‫پر‬ ‫صورت‬Stack‫با‬ ‫شما‬ ‫برنامه‬Stack-Overflow‫و‬ ‫شد‬ ‫خواهد‬ ‫مواجه‬
‫شود‬ ‫می‬ ‫منهدم‬ ‫شما‬ ‫برنامه‬.
•‫ساختار‬ ‫دلیل‬ ‫به‬LIFO‫روی‬ ‫بر‬ ‫حافظه‬ ‫تخصیص‬ ،Stack‫از‬ ‫سریعتر‬ ‫بسیار‬
‫روی‬ ‫بر‬ ‫حافظه‬ ‫تخصیص‬Heap‫باشد‬ ‫می‬.
•‫روی‬ ‫بر‬ ‫یافته‬ ‫تخصیص‬ ‫حافظه‬Stack‫خار‬ ‫تعریف‬ ‫بلوک‬ ‫از‬ ‫یا‬ ‫تابع‬ ‫از‬ ‫اینکه‬ ‫از‬ ‫پس‬ ،‫ج‬
‫آزاد‬ ‫خودکار‬ ‫طور‬ ‫به‬ ،‫شدیم‬(‫مجدد‬ ‫استفاده‬ ‫قابل‬ ‫و‬)‫شد‬ ‫خواهد‬.‫صورت‬ ‫در‬ ‫اما‬
‫نرو‬ ‫بین‬ ‫از‬ ‫تا‬ ‫کنیم‬ ‫ذخیره‬ ‫و‬ ‫کپی‬ ‫را‬ ‫آنها‬ ‫است‬ ‫بهتر‬ ،‫ها‬ ‫داده‬ ‫آن‬ ‫به‬ ‫مجدد‬ ‫نیاز‬‫ند‬.
‫بندی‬ ‫جمع‬:‫داده‬ ‫باالی‬ ‫حجم‬ ‫پیوسته‬ ‫پردازش‬ ‫به‬ ‫نیاز‬ ‫که‬ ‫مواقعی‬ ‫در‬ ‫تنها‬ ‫پس‬
‫را‬ ‫ها‬ ‫داده‬ ‫است‬ ‫بهتر‬ ،‫داریم‬‫بر‬‫روی‬Heap‫که‬ ‫باشد‬ ‫حواسمان‬ ‫حتما‬ ‫و‬ ‫کنیم‬ ‫ذخیره‬
‫جلوگی‬ ‫حافظه‬ ‫بیهوده‬ ‫مصرف‬ ‫از‬ ‫تا‬ ‫کنیم‬ ‫آزاد‬ ‫کار‬ ‫اتمام‬ ‫از‬ ‫پس‬ ‫باید‬ ‫را‬ ‫فضا‬ ‫این‬‫ری‬
‫شود‬.
‫سوال‬:‫چیست؟‬ ‫شده‬ ‫داده‬ ‫ورودی‬ ‫ازای‬ ‫به‬ ‫زیر‬ ‫کد‬ ‫خروجی‬
‫ورودی‬:
4
3512
‫کد‬:
int main() {
int n;
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
int* b = a + n;
while (b-- != a)
cout << *b << "t";
}
‫کالسها‬ ‫نوشتن‬
‫زبان‬ ‫دو‬ ‫در‬ ‫کالسها‬ ‫نوشتن‬C++‫و‬Java‫ک‬ ‫تفاوتی‬ ‫تنها‬ ‫ندارد‬ ‫چندانی‬ ‫تفاوت‬ ‫بوده‬ ‫یکسان‬ ‫تقریبا‬‫ه‬
‫همیشه‬‫وجود‬ ‫است‬ ‫بارز‬‘;’‫در‬ ‫کالس‬ ‫بالک‬ ‫انتهای‬ ‫در‬C++‫میباشد‬.
‫کنید‬ ‫توجه‬ ‫زیر‬ ‫مثال‬ ‫به‬:
class Rectangle
{
int width, height;
int getArea()
{
return width*height;
}
};
‫کالسها‬ ‫توابع‬ ‫نوشتن‬
‫زبان‬C++‫ب‬ ‫در‬ ‫را‬ ‫کالس‬ ‫توابع‬ ‫امضای‬ ‫تنها‬ ‫که‬ ‫میدهد‬ ‫نویس‬ ‫برنامه‬ ‫به‬ ‫را‬ ‫امکان‬ ‫این‬ ،‫کد‬ ‫خوانایی‬ ‫افزایش‬ ‫برای‬‫دنه‬
‫کند‬ ‫سازی‬ ‫پیاده‬ ‫کالس‬ ‫همان‬.‫و‬ ‫بنویسد‬ ‫کالس‬ ‫خارج‬ ‫در‬ ‫را‬ ‫تابع‬ ‫بدنه‬ ‫میتواند‬ ‫نویس‬ ‫برنامه‬ ‫دیگر‬ ‫بیان‬ ‫به‬‫امضای‬ ‫تنها‬
‫بیاورد‬ ‫کالس‬ ‫در‬ ‫را‬ ‫تابع‬ ‫آن‬.‫عملگر‬ ‫از‬ ‫تابع‬ ‫دهی‬ ‫آدرس‬ ‫برای‬ ‫که‬ ‫کنید‬ ‫دقت‬::‫کنیم‬ ‫می‬ ‫استفاده‬.
‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫قطعه‬ ‫به‬ ‫مثال‬ ‫عنوان‬ ‫به‬:
class Rectangle
{
int width, height;
void set_values(int, int);
};
void Rectangle::set_values(int x, int y)
{
width = x;
height = y;
}
‫ها‬ ‫دسترسی‬ ‫سطح‬
‫میتوانند‬ ‫کالس‬ ‫در‬ ‫شده‬ ‫تعریف‬ ‫های‬ ‫داده‬ ‫از‬ ‫هرکدام‬Private‫یا‬Public‫یا‬
Protected‫باشند‬.
‫اعضای‬Private:‫هستند‬ ‫دسترسی‬ ‫قابل‬ ‫خودشان‬ ‫کالس‬ ‫داخل‬ ‫از‬ ‫فقط‬.
‫اعضای‬Public:‫است‬ ‫دسترسی‬ ‫قابل‬ ،‫باشد‬ ‫دسترسی‬ ‫قابل‬ ‫شی‬ ‫که‬ ‫جا‬ ‫هر‬ ‫در‬.
‫اعضای‬Protected:‫قابل‬ ‫دوستانشان‬ ‫و‬ ‫فرزندانشان‬ ،‫خودشان‬ ‫کالس‬ ‫داخل‬ ‫در‬
‫هستند‬ ‫دسترسی‬.
‫ت‬ ‫هنگام‬ ‫تابعی‬ ‫یا‬ ‫متغیر‬ ‫دسترسی‬ ‫سطح‬ ‫اگر‬‫ع‬‫سطح‬ ،‫نشود‬ ‫مشخص‬ ‫ریف‬
‫دسترسی‬Private‫شود‬ ‫می‬ ‫گرفته‬ ‫نظر‬ ‫در‬ ‫فرض‬ ‫پیش‬ ‫طور‬ ‫به‬ ‫آن‬ ‫برای‬.
‫میان‬ ‫دیگر‬ ‫تفاوتی‬ ‫میتوانید‬ ‫بعد‬ ‫صفحه‬ ‫در‬syntax‫شده‬ ‫آورده‬ ‫کد‬ ‫در‬ ‫را‬ ‫زبان‬ ‫دو‬ ‫این‬
‫ببینید‬:
‫مثال‬:
class Rectangle {
int width, height;
public:
int area() { return width*height; }
int getHeight() { return height; }
};
‫توابع‬ ‫فوق‬ ‫مثال‬ ‫در‬area()‫و‬getHeight()‫دسترسی‬ ‫سطح‬ ‫دارای‬public‫میباشند‬
‫متغیرهای‬ ‫و‬width‫و‬height‫دسترسی‬ ‫سطح‬ ‫دارای‬private‫میباشند‬.
‫تذکر‬:‫توسط‬ ‫خصوصی‬ ‫عضو‬ ‫یک‬ ‫گر‬ ‫اشاره‬ ‫یا‬ ‫ارجاع‬ ‫بازگرداندن‬ ‫که‬ ‫کنید‬ ‫دقت‬‫تابعی‬
‫رفتن‬ ‫بین‬ ‫از‬ ‫باعث‬ ،‫عمومی‬Encapsulation‫میشود‬ ‫کالس‬.
‫ها‬ ‫سازنده‬
‫زبان‬ ‫در‬C++‫مانند‬ ‫نیز‬Java‫است‬ ‫سازنده‬ ‫عدد‬ ‫یک‬ ‫حداقل‬ ‫دارای‬ ‫کالس‬ ‫هر‬.‫سازنده‬ ‫به‬
‫زبان‬ ‫در‬ ‫آرگومان‬ ‫بدون‬C++،default constructor‫گویند‬ ‫می‬.‫به‬‫فراخوانی‬ ‫و‬ ‫نوشته‬ ‫نحوه‬
‫کنید‬ ‫توجه‬ ‫کدها‬ ‫این‬ ‫در‬ ‫ها‬ ‫سازنده‬ ‫شدن‬:
#include <iostream>
using namespace std;
class Circle
{
double radius;
public:
Circle(double r) { radius = r; }
double circum() { return 2 * radius*3.14159265; }
};
int main()
{
Circle foo(10.0); // functional form
Circle bar = 20.0; // assignment init.
Circle baz{ 30.0 }; // uniform init.
Circle qux = { 40.0 }; // POD-like
cout << "foo's circumference: " << foo.circum() <<
'n'; //prints: foo's circumference: 62.8319
return 0;
}
‫مثال‬:
#include <bits/stdc++.h> //or #include <iostream> if in VS
using namespace std;
class Query
{
public:
int L, R;
};
void printQuerySums(int a[], int n, Query q[], int m)
{
for (int i = 0; i < m; i++) {
int L = q[i].L, R = q[i].R, sum = 0;
for (int j = L; j <= R; j++)
sum += a[j];
cout << "Sum of [" << L << ", " << R << "] is " << sum << endl;
}
}
int main()
{
int a[] = { 1, 1, 2, 1, 3, 4, 5, 2, 8 };
int n = sizeof(a) / sizeof(a[0]);
Query q[] = { { 0, 4 }, { 1, 3 }, { 2, 4 } };
int m = sizeof(q) / sizeof(q[0]);
printQuerySums(a, n, q, m);
return 0;
}
‫دارد‬ ‫وجود‬ ‫توجه‬ ‫قابل‬ ‫نکته‬ ‫سه‬ ‫فوق‬ ‫مثال‬ ‫در‬:
•‫کالس‬ ‫عمومی‬ ‫پارامترهای‬ ‫اولیه‬ ‫مقداردهی‬ ‫روش‬ ‫یک‬:‫برای‬ ‫فقط‬ ‫روش‬ ‫این‬ ‫که‬ ‫کنید‬ ‫دقت‬
‫که‬ ‫کالسهایی‬‫دارند‬ ‫عمومی‬ ‫پارامتر‬ ‫فقط‬‫است‬ ‫استفاده‬ ‫قابل‬.‫تعداد‬ ‫که‬ ‫کنید‬ ‫دقت‬ ‫همچنین‬
‫باشد‬ ‫بیشتر‬ ‫کالس‬ ‫متغیرهای‬ ‫تعداد‬ ‫از‬ ‫نباید‬ ‫شده‬ ‫مقداردهی‬ ‫پارامترهای‬.
•‫تابع‬ ‫عملکرد‬ ‫نحوه‬sizeof‫کالس‬ ‫از‬ ‫شده‬ ‫ایجاد‬ ‫اشیای‬ ‫برای‬
•‫تابع‬ ‫یک‬ ‫به‬ ،‫کالس‬ ‫از‬ ‫شده‬ ‫ایجاد‬ ‫اشیای‬ ‫از‬ ‫ای‬ ‫آرایه‬ ‫ارسال‬
‫مثال‬:
class Rectangle
{
int width, height;
public:
Rectangle();
Rectangle(int, int);
int area(void) { return (width*height); }
};
Rectangle::Rectangle()
{
width = 5;
height = 5;
{
Rectangle::Rectangle(int a, int b)
{
width = a;
height = b;
}
int main()
{
Rectangle rect(3, 4);
Rectangle rectb; //calling default constructor
cout << "rect area: " << rect.area() << endl;//prints: rect area: 12
cout << "rectb area: "<< rectb.area() << endl;//prints: rectb area: 25
return 0;
}
‫فراخوانی‬ ‫هنگام‬default constructor‫کنید‬ ‫توجه‬ ‫زیر‬ ‫نکات‬ ‫به‬ ‫حتما‬:
Rectangle rectb; // default constructor called
Rectangle rectc(); // function declaration (default constructor
NOT called)
Rectangle rectd{}; // default constructor called
‫سه‬ ‫هر‬ ‫با‬ ‫میتواند‬ ‫سازنده‬ ‫یک‬syntax‫دهد‬ ‫انجام‬ ‫را‬ ‫عناصر‬ ‫اولیه‬ ‫دهی‬ ‫مقدار‬ ‫زیر‬:
(‫میباشند‬ ‫یکدیگر‬ ‫معادل‬ ‫زیر‬ ‫دستورات‬)
Rectangle::Rectangle(int x, int y) { width = x; height = y; }
Rectangle::Rectangle(int x, int y) : width(x) { height = y; }
Rectangle::Rectangle(int x, int y) : width(x), height(y) { }
this
‫نام‬ ‫به‬ ‫گری‬ ‫اشاره‬ ‫طریق‬ ‫از‬ ‫میتواند‬ ‫شیء‬ ‫هر‬this‫دسترسی‬ ‫خودش‬ ‫آدرس‬ ‫به‬
‫کند‬ ‫پیدا‬.this‫قواعد‬ ‫از‬ ‫بنابراین‬ ‫و‬ ‫میباشد‬ ‫کالس‬ ‫به‬ ‫پوینتر‬ ‫جنس‬ ‫دارای‬syntax
‫میکند‬ ‫پیروی‬ ‫پوینترها‬.‫یک‬ ‫با‬ ‫که‬ ‫نیست‬ ‫بد‬ ‫شروع‬ ‫برای‬operator‫آشنا‬ ‫جدید‬
‫شویم‬:
‫اپراتور‬->‫هستند‬ ‫معادل‬ ‫زیر‬ ‫دستور‬ ‫دو‬ ‫که‬ ‫میکند‬ ‫عمل‬ ‫ای‬ ‫گونه‬ ‫به‬:
(*ap).grade = 20;
ap->grade = 20;
‫را‬ ‫پوینتر‬ ‫ابتدا‬ ‫واقع‬ ‫در‬ ‫عملگر‬ ‫این‬ ‫میکنید‬ ‫مشاهده‬ ‫که‬ ‫همانطور‬dereference‫میکند‬
‫میکند‬ ‫پیدا‬ ‫دسترسی‬ ‫شیء‬ ‫آن‬ ‫آرگومانهای‬ ‫به‬ ‫سپس‬.
‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
#include <iostream>
using namespace std;
class Box
{
public:
Box(double l = 2.0, double b = 2.0, double h = 2.0) //
Constructor definition
{
cout << "Constructor called." << endl;
length = l;
breadth = b;
height = h;
}
double Volume()
{
return length * breadth * height;
}
int compare(Box box)
{
return this->Volume() > box.Volume(); // returns 1 if the
statement is true, otherwise 0 would be returned
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
int main(void)
{
Box Box1(3.3, 1.2, 1.5); // Declare box1
Box Box2(8.5, 6.0, 2.0); // Declare box2
if (Box1.compare(Box2))
{
cout << "Box2 is smaller than Box1" << endl;
}
else
{
cout << "Box2 is equal to or larger than Box1" << endl;
}
return 0;
}
‫خروجی‬‫باشد‬ ‫می‬ ‫زیر‬ ‫شکل‬ ‫به‬ ‫کد‬ ‫این‬:
Constructor called.
Constructor called.
Box2 is equal to or larger than Box1
‫تذکر‬:‫از‬ ‫استفاده‬this‫میشود‬ ‫محسوب‬ ‫خطا‬ ‫ایستا‬ ‫توابع‬ ‫در‬.
‫گر‬ ‫اشاره‬ ‫که‬ ‫صورت‬ ‫بدین‬ ‫دارد‬ ‫وجود‬ ‫توجهی‬ ‫قابل‬ ‫نکته‬ ‫اما‬this‫زبان‬ ‫در‬ ‫نمیتواند‬C++‫سازنده‬ ‫از‬ ‫ای‬ ‫زنجیره‬ ‫تشکیل‬
‫بدهد‬ ‫را‬ ‫ها‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬ ‫مثال‬ ‫عنوان‬ ‫به‬:
class A
{
public:
A()
{
A(0);
}
A(int a)
{
cout << "did";
}
};
‫جای‬ ‫به‬ ‫ششم‬ ‫خط‬ ‫در‬ ‫اگر‬ ‫فوق‬ ‫کد‬ ‫در‬A(0);‫دستور‬this(0);‫میشدیم‬ ‫رو‬ ‫به‬ ‫رو‬ ‫کامپایلر‬ ‫خطای‬ ‫با‬ ‫مینوشتیم‬ ‫را‬.
(VS 2013 & g++)
‫دیگر‬ ‫مثالی‬:
class CDummy
{
public:
int isItMe(CDummy& param);
};
int CDummy::isItMe(CDummy& param)
{
if (&param == this) return true;
else return false;
}
int main()
{
CDummy a;
CDummy* b = &a;
if (b->isItMe(a))
cout << "yes, &a is b" << endl;
else
cout << "no, they are differentn";
}
‫مخرب‬ ‫توابع‬(Destructor)
Destructor‫دارند‬ ‫ها‬ ‫سازنده‬ ‫مخالف‬ ‫ای‬ ‫وظیفه‬ ‫ها‬.
Destructor‫که‬ ‫میشوند‬ ‫اجرا‬ ‫زمانی‬object‫ای‬‫تخریب‬ ،‫است‬ ‫گردیده‬ ‫ایجاد‬ ‫که‬
‫گردد‬.
‫یک‬ ‫زندگی‬ ‫طول‬ ‫که‬ ‫افتد‬ ‫اتفاق‬ ‫میتواند‬ ‫زمانی‬ ‫تخریب‬object‫رسیده‬ ‫پایان‬ ‫به‬
‫باشد‬.
Destructor‫همانند‬ ‫نیز‬ ‫ها‬Constructor‫با‬ ‫همنام‬ ‫ها‬class‫و‬ ‫هستند‬ ‫نظر‬ ‫مورد‬
‫عالمت‬ ‫یک‬ ‫تنها‬~‫دارد‬ ‫قرار‬ ‫آنها‬ ‫نام‬ ‫ابتدای‬ ‫در‬.
Destructor‫همانند‬ ‫نیز‬ ‫ها‬Constructor‫داشت‬ ‫نخواهند‬ ‫بازگشتی‬ ‫مقدار‬ ‫ها‬.
‫اگر‬Destructor‫می‬ ‫ایجاد‬ ‫اتوماتیک‬ ‫صورت‬ ‫به‬ ‫نگردد‬ ‫تعریف‬ ‫صریح‬ ‫صورت‬ ‫به‬‫شود‬.
Destructor‫مناسبند‬ ‫هستند‬ ‫پویا‬ ‫حافظه‬ ‫دارای‬ ‫که‬ ‫اشیایی‬ ‫برای‬ ‫ها‬.
‫آنها‬ ‫با‬ ‫کار‬ ‫نحوه‬ ‫و‬ ‫کالس‬ ‫از‬ ‫متغیر‬ ‫ساخت‬ ‫انواع‬
‫زبان‬ ‫در‬ ‫متغیرها‬C++‫میشوند‬ ‫مقداردهی‬ ‫و‬ ‫تعریف‬ ‫گونه‬ ‫دو‬ ‫به‬:
•‫کالس‬ ‫جنس‬ ‫از‬ ‫متغیر‬
•‫کالس‬ ‫به‬ ‫گر‬ ‫اشاره‬ ‫جنس‬ ‫از‬ ‫متغیر‬
‫اش‬ ‫را‬ ‫حافظه‬ ‫آن‬ ‫روی‬ ‫بر‬ ‫داریم‬ ‫تصمیم‬ ‫که‬ ‫است‬ ‫مکانی‬ ‫بنابر‬ ‫عمدتا‬ ‫نوع‬ ‫دو‬ ‫این‬ ‫تفاوت‬‫غال‬
‫کنیم‬.‫روی‬ ‫بر‬ ‫فضا‬ ‫اول‬ ‫نوع‬ ‫در‬Stack‫دوم‬ ‫نوع‬ ‫در‬ ‫که‬ ‫حالی‬ ‫در‬ ،‫میشود‬ ‫گرفته‬(‫علت‬ ‫به‬
new‫کردن‬)‫روی‬ ‫بر‬ ‫فضا‬Heap‫میشود‬ ‫گرفته‬.
‫نوع‬ ‫متغیرهای‬ ،‫بودند‬ ‫اول‬ ‫نوع‬ ‫از‬ ‫متغیرها‬ ‫همگی‬ ‫دیدید‬ ‫که‬ ‫مثالهایی‬ ‫تمامی‬ ‫تاکنون‬‫دوم‬
‫عملگر‬ ‫واسطه‬ ‫به‬ ،‫بودن‬ ‫پوینتری‬ ‫علت‬ ‫به‬->‫میکنند‬ ‫پیدا‬ ‫دسترسی‬ ‫خود‬ ‫آرگومانهای‬ ‫به‬.
‫نکته‬:‫زبان‬ ‫که‬ ‫آنجا‬ ‫از‬C++‫فاقد‬Garbage Collector‫به‬ ‫که‬ ‫متغیرهایی‬ ‫تمامی‬ ،‫میباشد‬
‫دستور‬ ‫واسطه‬new‫دستو‬ ‫توسط‬ ‫دستی‬ ‫طور‬ ‫به‬ ‫باید‬ ،‫میشود‬ ‫گرفته‬ ‫حافظه‬ ‫آنها‬ ‫برای‬‫ر‬
delete‫و‬ ‫کرد‬ ‫خواهد‬ ‫اشغال‬ ‫زیادی‬ ‫حافظه‬ ‫برنامه‬ ‫صورت‬ ‫این‬ ‫غیر‬ ‫در‬ ‫شوند‬ ‫پاک‬ ‫نهایت‬ ‫در‬
‫بزند‬ ‫فایلها‬ ‫دیگر‬ ‫به‬ ‫آسیبی‬ ‫است‬ ‫ممکن‬ ‫موارد‬ ‫بعضی‬ ‫در‬ ‫حتی‬.‫ت‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬‫وجه‬
‫کنید‬:
// pointer to classes example
#include <iostream>
using namespace std;
class Rectangle
{
int width, height;
public:
Rectangle(int x, int y) : width(x), height(y) {}
int area(void) { return width * height; }
};
int main()
{
Rectangle obj(3, 4);
Rectangle * foo, *bar, *baz;
foo = &obj;
bar = new Rectangle(5, 6);
baz = new Rectangle[2] {{ 2, 5 }, { 3, 6 } };
cout << "obj's area: " << obj.area() << 'n';
cout << "*foo's area: " << foo->area() << 'n';
cout << "*bar's area: " << bar->area() << 'n';
cout << "baz[0]'s area:" << baz[0].area() << 'n';
cout << "baz[1]'s area:" << baz[1].area() << 'n';
delete bar;
delete[] baz;
return 0;
}
‫میباشد‬ ‫شکل‬ ‫بدین‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫خروجی‬:
obj's area: 12
*foo's area: 12
*bar's area: 30
baz[0]'s area:10
baz[1]'s area:18
‫نکته‬:‫دستور‬delete[]‫دستور‬ ‫مانند‬ ‫عملکردی‬ ‫حالت‬ ‫بدترین‬ ‫در‬delete‫ولی‬ ‫دارد‬
‫کند‬ ‫آزاد‬ ‫میتواند‬ ‫را‬ ‫بیشتری‬ ‫خیلی‬ ‫فضای‬ ‫حالت‬ ‫بهترین‬ ‫در‬.
‫ارثبری‬
‫دستور‬ ‫از‬ ‫جاوا‬ ‫زبان‬ ‫در‬ ،‫میکند‬ ‫ارثبری‬ ‫دیگری‬ ‫کالس‬ ‫از‬ ‫کالس‬ ‫یک‬ ‫اینکه‬ ‫اعالن‬ ‫برای‬extends‫در‬ ‫اما‬ ،‫میشود‬ ‫استفاده‬
‫زبان‬C++‫عملگر‬ ‫از‬ ‫آن‬ ‫جای‬ ‫به‬:‫واژه‬ ‫و‬public‫میشود‬ ‫استفاده‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬:
#include <iostream>
using namespace std;
class Polygon
{
protected:
int width, height;
public:
void set_values(int a, int b)
{
width = a; height = b;
}
};
class Rectangle : public Polygon
{
public:
int area()
{
return width * height;
}
};
class Triangle : public Polygon
{
public:
int area() { return width * height / 2; }
};
int main()
{
Rectangle rect;
Triangle trgl;
rect.set_values(4, 5);
trgl.set_values(4, 5);
cout << rect.area() << 'n';
cout << trgl.area() << 'n';
return 0;
}
‫میباشد‬ ‫صورت‬ ‫بدین‬ ‫فوق‬ ‫کد‬ ‫خروجی‬:
20
10
‫زبان‬ ‫در‬C++،‫شود‬ ‫فراخوانی‬ ‫کالس‬ ‫یک‬ ‫سازنده‬ ‫که‬ ‫صورتی‬ ‫در‬ ‫جاوا‬ ‫همانند‬ ‫نیز‬default
constructor‫کالس‬ ‫آن‬ ‫والد‬(super()‫جاوا‬ ‫در‬(‫میشود‬ ‫فراخوانی‬ ‫نیز‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫قطعه‬ ‫به‬:
class Mother
{
public:
Mother()
{
cout << "Mother: no parametersn";
}
Mother(int a)
{
cout << "Mother: int parametern";
}
};
class Daughter : public Mother
{
public:
Daughter(int a)
{
cout << "Daughter: int parameternn";
}
};
class Son : public Mother {
public:
Son(int a) : Mother(a)
{
cout << "Son: int parameternn";
}
};
int main()
{
Daughter kelly(0);
Son bud(0);
return 0;
}
‫میباشد‬ ‫زیر‬ ‫شکل‬ ‫به‬ ‫فوق‬ ‫کد‬ ‫خروجی‬:
Mother: no parameters
Daughter: int parameter
Mother: int parameter
Son: int parameter
‫میش‬ ‫ایجاد‬ ‫فرزند‬ ‫جنس‬ ‫از‬ ‫جدیدی‬ ‫شی‬ ‫که‬ ‫هنگامی‬ ‫گفت‬ ‫میتوان‬ ‫کلی‬ ‫طور‬ ‫به‬،‫ود‬
‫اجرای‬ ‫قبل‬Constructor،‫موردنظر‬ ‫کالس‬ ‫به‬ ‫متعلق‬Constructor‫کالس‬ ‫به‬ ‫متعلق‬
‫گردد‬ ‫می‬ ‫اجرا‬ ‫والد‬.
‫صورت‬ ‫به‬ ‫ها‬ ‫سازنده‬ ‫اجرای‬ ‫نحوه‬ ‫که‬ ‫گفت‬ ‫میتوان‬top down order‫بود‬ ‫خواهد‬.
‫برای‬destructor‫ابتدا‬ ‫ها‬destructor‫سپس‬ ‫و‬ ‫شده‬ ‫اجرا‬ ‫فرزند‬ ‫کالس‬destructor
‫میشود‬ ‫زده‬ ‫صدا‬ ‫مادر‬.
‫صورت‬ ‫به‬ ‫ها‬ ‫مخرب‬ ‫اجرای‬ ‫نحوه‬ ‫که‬ ‫گفت‬ ‫میتوان‬bottom up order‫بود‬ ‫خواهد‬.
// pointer is destroyed because it goes out of scope,
// but not the object it pointed to. memory leak
if (1) { Foo *myfoo = new Foo("foo"); }
// pointer is destroyed because it goes out of scope,
// object it points to is deleted. no memory leak
if (1) {
Foo *myfoo = new Foo("foo");
delete myfoo;
}
// no memory leak, object goes out of scope
if (1) { Foo myfoo("foo"); }
‫کنید‬ ‫توجه‬ ‫زیر‬ ‫نکات‬ ‫به‬:
•‫بود‬ ‫خواهد‬ ‫مجاز‬ ‫والد‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫به‬ ‫فرزند‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ‫انتساب‬.
•‫نم‬ ‫منتسب‬ ‫فرزند‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫به‬ ‫توان‬ ‫نمی‬ ‫را‬ ‫والد‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫یک‬‫ود‬.
•‫از‬ ‫استفاده‬ ‫با‬Casting‫کالس‬ ‫گر‬ ‫اشاره‬ ‫به‬ ‫را‬ ‫والد‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ‫میتوان‬
‫کرد‬ ‫منسوب‬ ‫فرزند‬.
•‫باعث‬ ‫میتواند‬ ‫فرزند‬ ‫کالس‬ ‫از‬ ‫شی‬ ‫عنوان‬ ‫به‬ ‫والد‬ ‫کالس‬ ‫از‬ ‫شی‬ ‫یک‬ ‫با‬ ‫رفتار‬‫بروز‬
‫گردد‬ ‫خطا‬.
•‫اگر‬p‫میتوان‬ ‫آنگاه‬ ،‫باشد‬ ‫والد‬ ‫کالس‬ ‫نوع‬ ‫از‬ ‫گری‬ ‫اشاره‬p‫آن‬ ‫از‬ ‫فرزندی‬ ‫هر‬ ‫به‬ ‫را‬
‫مرتبط‬ ‫تابع‬ ‫نیز‬ ‫فرزند‬ ‫کالس‬ ‫از‬ ‫تابعی‬ ‫فراخوانی‬ ‫صورت‬ ‫در‬ ،‫داد‬ ‫اشاره‬ ‫کالس‬
(‫همنام‬)‫میشود‬ ‫اجرا‬ ‫والد‬ ‫کالس‬ ‫در‬.
‫مجازی‬ ‫توابع‬ ‫و‬ ‫مورفیسم‬ ‫پلی‬
‫مجازی‬ ‫تابع‬:‫کلیدی‬ ‫کلمه‬ ‫با‬ ‫که‬ ‫است‬ ‫تابعی‬virtual‫شود‬ ‫می‬ ‫مشخص‬.
•‫از‬ ‫یکی‬ ‫حداقل‬ ‫در‬ ‫یعنی‬ ،‫شود‬ ‫می‬ ‫تعریف‬ ‫مجازی‬ ‫طور‬ ‫به‬ ‫تابعی‬ ‫وقتی‬
‫دارد‬ ‫وجود‬ ‫نام‬ ‫همین‬ ‫با‬ ‫تابعی‬ ‫نیز‬ ‫فرزند‬ ‫کالسهای‬.
•‫بتوانی‬ ،‫گرها‬ ‫اشاره‬ ‫از‬ ‫استفاده‬ ‫هنگام‬ ‫که‬ ‫میدهند‬ ‫را‬ ‫امکان‬ ‫این‬ ‫مجازی‬ ‫توابع‬‫م‬
‫یابیم‬ ‫دست‬ ‫جاری‬ ‫شی‬ ‫توابع‬ ‫به‬ ،‫گر‬ ‫اشاره‬ ‫نوع‬ ‫گرفتن‬ ‫نظر‬ ‫در‬ ‫بدون‬.
•‫کلیدی‬ ‫کلمه‬ ‫از‬ ‫استفاده‬virtual‫شود‬ ‫می‬ ‫سبب‬ ،‫والد‬ ‫کالس‬ ‫در‬ ‫تابعی‬ ‫برای‬
‫گردد‬ ‫مجازی‬ ‫نیز‬ ‫فرزند‬ ‫کالسهای‬ ‫در‬ ‫مذکور‬ ‫تابع‬.
•‫فر‬ ‫کالسهای‬ ‫تابع‬ ‫برای‬ ،‫بیشتر‬ ‫شدن‬ ‫مشخص‬ ‫برای‬ ‫میدهند‬ ‫ترجیح‬ ‫برخی‬‫زند‬
‫کنند‬ ‫قید‬ ‫را‬ ‫مجازی‬ ‫کلمه‬ ‫نیز‬.
‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
class A
{
public:
virtual void f()
{
cout << "A::f() executingn";
}
};
class B : public A
{
public:
void f()
{
cout << "B::f() executingn";
}
};
int main()
{
A a;
B b;
A* p = &a;
p->f();
p = &b;
p->f();
}
class Base {
public:
void NonVirtual() {
cout << "Base NonVirtual called.n";
}
virtual void Virtual() {
cout << "Base Virtual called.n";
}
};
class Derived : public Base {
public:
void NonVirtual() {
cout << "Derived NonVirtual called.n";
}
void Virtual() {
cout << "Derived Virtual called.n";
}
};
int main() {
Base* bBase = new Base();
Base* bDerived = new Derived();
bBase->NonVirtual();
bBase->Virtual();
bDerived->NonVirtual();
bDerived->Virtual();
}
‫کالسها‬ ‫تمامی‬ ‫در‬ ‫باید‬ ‫می‬ ‫که‬ ‫باشد‬ ‫داشته‬ ‫وجود‬ ‫مجازی‬ ‫تابع‬ ‫اگر‬override‫را‬ ‫آن‬ ،‫گردد‬
PureVirtual‫نامیم‬ ‫می‬.‫ندارد‬ ‫سازی‬ ‫پیاده‬ ‫به‬ ‫نیاز‬ ‫تابعی‬ ‫چنین‬.
class Vertebrate
{
public:
virtual void eat() = 0; //pure virtual function
};
class Fish : public Vertebrate
{
public:
void eat(); //implemented specifically for Fish class elsewhere
};
‫تابع‬pure virtual‫تابع‬ ‫را‬Abstract‫نامند‬ ‫می‬ ‫نیز‬.
Abstract Class
‫تابع‬ ‫یک‬ ‫کم‬ ‫دست‬ ‫که‬ ‫کالسی‬pure virtual‫دارد‬.
Concrete Class
‫کالسی‬‫تابع‬ ‫که‬pure virtual‫ندارد‬.
Interface
‫آن‬ ‫توابع‬ ‫تمامی‬ ‫که‬ ‫کالسی‬pure virtual‫باشند‬.
‫نکات‬:
•‫کالس‬ ‫یک‬ ‫از‬Abstract‫کرد‬ ‫ایجاد‬ ‫شی‬ ‫توان‬ ‫نمی‬.
•‫کالس‬ ‫از‬Abstract‫کرد‬ ‫ارثبری‬ ‫میتوان‬ ‫تنها‬.
•‫توابع‬ ‫تمامی‬ ‫فرزند‬ ‫کالس‬abstract‫را‬ ‫آنها‬ ‫که‬ ‫مادامی‬ ‫و‬ ‫برد‬ ‫می‬ ‫ارث‬ ‫به‬ ‫را‬override‫کالس‬ ‫یک‬ ‫نیز‬ ‫خود‬ ‫نکند‬
abstract‫میشود‬ ‫محسوب‬.
•‫توابع‬abstract‫کالس‬ ‫در‬‫باید‬ ‫فرزند‬override‫کرد‬ ‫ایجاد‬ ‫آن‬ ‫از‬ ‫شی‬ ‫بتوان‬ ‫تا‬ ‫شوند‬.
•‫کالس‬ ‫یک‬abstract‫میکنند‬ ‫ارثبری‬ ‫آن‬ ‫از‬ ‫که‬ ‫است‬ ‫کالسهایی‬ ‫تمامی‬ ‫از‬ ‫مشترکی‬ ‫وجوه‬.
class Shape
{
protected:
int posX, posY;
public:
virtual void draw() = 0;
void setPosition(int pX, int pY)
{
posX = pX;
posY = pY;
}
};
class Rectangle : public Shape
{
public:
virtual void draw()
{
cout << "Drawing rectangle at " << posX << " " << posY << endl;
}
};
class Hexagon : public Shape
{
public:
virtual void draw()
{
cout << "Drawing hexagon at " << posX << " " << posY << endl;
}
};
int main()
{
const int NUM_SHAPES = 3;
Shape* shapeArray[] = { new Hexagon(), new Rectangle(), new Hexagon() };
int posX = 5, posY = 15;
for (int k = 0; k < NUM_SHAPES; k++) //set positions of all the shapes
{
shapeArray[k]->setPosition(posX, posY);
posX += 10;
posY += 10;
};
for (int j = 0; j < NUM_SHAPES; j++) //draw all the shapes at their positions
shapeArray[j]->draw();
return 0;
}
‫نمونه‬ ‫و‬ ‫استاتیک‬
‫در‬ ‫استاتیک‬ ‫توابع‬ ‫و‬ ‫متغیرها‬C++‫یک‬ ‫فقط‬ ‫و‬ ‫هستند‬ ‫مشابه‬ ‫عملکرد‬ ‫نظر‬ ‫از‬ ‫کامال‬ ‫جاوا‬ ‫و‬
‫دارند‬ ‫سینتکسی‬ ‫تفاوت‬:‫در‬C++‫عملگر‬ ‫توسط‬ ‫کالس‬ ‫توابع‬ ‫و‬ ‫متغیرها‬ ‫به‬::‫میتوانیم‬
‫کنیم‬ ‫پیدا‬ ‫دسترسی‬.
‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬:
class Dummy
{
public:
static int n;
Dummy() { n++; }
~Dummy() { n--; }
};
int Dummy::n = 0;
int main()
{
Dummy a;
Dummy b[5];
Dummy * c = new Dummy;
cout << a.n << endl;
delete c;
cout << b->n << endl;
b->n = 10;
cout << b[2].n << endl;
return 0;
}
‫چندگانه‬ ‫ارثبری‬
‫زبان‬C++‫عنو‬ ‫به‬ ‫یعنی‬ ،‫کند‬ ‫می‬ ‫پشتیبانی‬ ‫را‬ ‫چندگانه‬ ‫ارثبری‬ ،‫جاوا‬ ‫برخالف‬‫ان‬
‫خ‬ ‫با‬ ‫برنامه‬ ‫اینکه‬ ‫بدون‬ ‫کند‬ ‫ارثبری‬ ‫کالس‬ ‫چند‬ ‫از‬ ‫تواند‬ ‫می‬ ‫کالس‬ ‫یک‬ ‫مثال‬‫طایی‬
‫شود‬ ‫مواجه‬.‫به‬‫شکل‬‫کنید‬ ‫توجه‬ ‫زیر‬:
class Polygon
{
protected:
int width, height;
public:
Polygon(int a, int b) : width(a), height(b) {}
};
class Output
{
public:
static void print(int i);
};
void Output::print(int i)
{
cout << i << 'n';
}
class Rectangle : public Polygon, public Output
{
public:
Rectangle(int a, int b) : Polygon(a, b) {}
int area()
{
return width*height;
}
};
class Triangle : public Polygon, public Output
{
public:
Triangle(int a, int b) : Polygon(a, b) {}
int area()
{
return width*height / 2;
}
};
int main()
{
Rectangle rect(4, 5);
Triangle trgl(4, 5);
rect.print(rect.area());
Triangle::print(trgl.area());
return 0;
}
‫است‬ ‫شکل‬ ‫بدین‬ ‫فوق‬ ‫برنامه‬ ‫خروجی‬:
20
10
‫سوال‬ ‫یک‬ ‫اما‬!!‫کند؟‬ ‫نمی‬ ‫پشتیبانی‬ ‫را‬ ‫چندگانه‬ ‫ارثبری‬ ‫جاوا‬ ‫چرا‬
‫کالس‬ ‫کنید‬ ‫فرض‬C‫نامهای‬ ‫به‬ ‫والد‬ ‫کالس‬ ‫دو‬ ‫دارای‬A‫و‬B‫کنید‬ ‫فرض‬ ‫و‬ ‫باشد‬
‫کالس‬C‫نام‬ ‫به‬ ‫تابعی‬ ‫از‬ ‫بخواهد‬print()‫سازی‬ ‫پیاده‬ ‫توابع‬ ‫این‬ ‫هردوی‬ ‫در‬ ‫که‬
‫کند‬ ‫استفاده‬ ‫شده‬.‫میشود؟‬ ‫زده‬ ‫صدا‬ ‫تابع‬ ‫کدام‬!‫خ‬ ‫کننده‬ ‫گیج‬ ‫برنامه‬ ،‫بله‬‫واهد‬
‫کند‬ ‫نمی‬ ‫پشتیبانی‬ ‫را‬ ‫چندگانه‬ ‫ارثبری‬ ‫جاوا‬ ‫زبان‬ ‫بنابراین‬ ‫و‬ ‫شد‬.‫ک‬ ‫حال‬ ‫اما‬‫زبان‬ ‫ه‬
C++‫نتیج‬ ‫رخدادی‬ ‫چنین‬ ‫وجود‬ ‫صورت‬ ‫در‬ ،‫کند‬ ‫می‬ ‫پشتیبانی‬ ‫را‬ ‫قابلیت‬ ‫این‬‫چه‬ ‫ه‬
‫شد؟‬ ‫خواهد‬
‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬ ‫لطفا‬ ‫فوق‬ ‫سوال‬ ‫جواب‬ ‫یافتن‬ ‫برای‬:
‫دوستی‬ ‫مفهوم‬
‫در‬C++‫نام‬ ‫به‬ ‫دارد‬ ‫وجود‬ ‫ارثبری‬ ‫بر‬ ‫عالوه‬ ‫ارتباط‬ ‫از‬ ‫دیگری‬ ‫نوع‬«‫دوستی‬».
‫میت‬ ،‫باشند‬ ‫شده‬ ‫تعریف‬ ‫دیگری‬ ‫کالس‬ ‫یک‬ ‫دوست‬ ‫عنوان‬ ‫به‬ ‫تابعی‬ ‫یا‬ ‫کالس‬ ‫اگر‬‫به‬ ‫وانند‬
‫متغیرهای‬protected‫و‬private‫کنند‬ ‫پیدا‬ ‫دسترسی‬ ‫کالس‬ ‫آن‬.
‫است‬ ‫برقرار‬ ‫زیر‬ ‫قواعد‬ ‫دوستی‬ ‫در‬:
•‫کالس‬ ‫اگر‬A‫کالس‬ ‫دوست‬ ‫عنوان‬ ‫به‬B‫کالس‬ ،‫باشد‬B‫کالس‬ ‫دوست‬A‫نیست‬
(‫ندارد‬ ‫تقارنی‬ ‫خاصیت‬ ‫دوستی‬)‫کالس‬ ‫برای‬ ‫دسترسی‬ ‫سطح‬ ‫این‬ ‫اینکه‬ ‫مگر‬B‫نیز‬
‫شود‬ ‫تعریف‬.
•‫کالس‬ ‫اگر‬A‫کالس‬ ‫دوست‬B‫کالس‬ ‫و‬ ‫باشد‬B‫کالس‬ ‫دوست‬C‫کالس‬ ،‫باشد‬A
‫کالس‬ ‫دوست‬C‫نیست‬( .‫ندارد‬ ‫ترایایی‬ ‫خاصیت‬ ‫دوستی‬)
•‫شوند‬ ‫نمی‬ ‫ارثبری‬ ‫ها‬ ‫دوستی‬.‫کالس‬ ‫اگر‬ ‫یعنی‬A‫کالس‬ ‫دوست‬B‫فرزندان‬ ،‫باشد‬
‫کالس‬A‫کالس‬ ‫دوست‬B‫نیستند‬.
‫بخوانید‬ ‫را‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫آن‬ ‫سازی‬ ‫پیاده‬ ‫و‬ ‫دوستی‬ ‫اعالن‬ ‫نحوه‬ ‫با‬ ‫آشنایی‬ ‫برای‬:
// friend class
#include <iostream>
using namespace std;
class Square;
class Rectangle
{
int width, height;
public:
int area() { return (width * height); }
void convert(Square a);
};
class Square
{
friend class Rectangle;
private:
int side;
public:
Square(int a) : side(a) {}
};
void Rectangle::convert(Square a)
{
width = a.side;
height = a.side;
}
int main()
{
Rectangle rect;
Square sqr(4);
rect.convert(sqr);
cout << rect.area();
return 0;
}
‫است‬ ‫زیر‬ ‫شکل‬ ‫به‬ ‫فوق‬ ‫کد‬ ‫خروجی‬:
16
‫کالس‬ ‫از‬ ‫پوچ‬ ‫اعالن‬ ‫یک‬ ‫کد‬ ‫ابتدای‬ ‫در‬ ‫چرا‬ ‫بیاید‬ ‫پیش‬ ‫سوال‬ ‫این‬ ‫شما‬ ‫برای‬ ‫است‬ ‫ممکن‬ ‫حال‬Square
‫دارد؟‬ ‫وجود‬
‫کلمه‬ ‫صورت‬ ‫این‬ ‫غیر‬ ‫در‬ ‫که‬ ‫است‬ ‫این‬ ‫سوال‬ ‫پاسخ‬Square‫کالس‬ ‫در‬ ‫رفته‬ ‫کار‬ ‫به‬Rectangle‫نامفهوم‬
‫میشود‬.
‫نیست‬ ‫کالس‬ ‫دو‬ ‫میان‬ ‫تنها‬ ‫دوستی‬ ‫مفهوم‬.‫با‬ ‫کالس‬ ‫یک‬ ‫دوست‬ ‫نیز‬ ‫تابع‬ ‫یک‬ ‫است‬ ‫ممکن‬‫شد‬.
‫کرد‬ ‫معرفی‬ ‫کالس‬ ‫آن‬ ‫دوست‬ ‫عنوان‬ ‫به‬ ‫را‬ ‫تابع‬ ‫آن‬ ‫کالس‬ ‫نوشتن‬ ‫هنگام‬ ‫در‬ ‫باید‬ ‫منظور‬ ‫بدین‬.‫ا‬‫گر‬
‫ک‬ ‫آن‬ ‫توابع‬ ‫و‬ ‫متغیرها‬ ‫به‬ ‫دسترسی‬ ‫قابلیت‬ ‫تابع‬ ‫آن‬ ‫یعنی‬ ،‫باشد‬ ‫کالس‬ ‫یک‬ ‫دوست‬ ‫تابعی‬‫را‬ ‫الس‬
‫دارد‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬:
class Rectangle
{
int width, height;
public:
Rectangle() {}
Rectangle(int x, int y) : width(x), height(y) {}
int area() { return width * height; }
friend Rectangle duplicate(const Rectangle&);
};
Rectangle duplicate(const Rectangle& param)
{
Rectangle res;
res.width = param.width * 2;
res.height = param.height * 2;
return res;
}
int main()
{
Rectangle foo;
Rectangle bar(2, 3);
foo = duplicate(bar);
cout << foo.area() << 'n';
return 0;
}
‫میباشد‬ ‫شکل‬ ‫بدین‬ ‫فوق‬ ‫برنامه‬ ‫خروجی‬:
24
‫نکته‬:‫تابع‬ ‫فوق‬ ‫مثال‬ ‫در‬duplicate‫کالس‬ ‫دوست‬Rectangle‫میتواند‬ ‫علت‬ ‫همین‬ ‫به‬ ‫و‬ ‫میباشد‬
‫آرگومانهای‬private‫کالس‬Rectangle‫دهد‬ ‫تغییر‬ ‫را‬.‫که‬ ‫کنید‬ ‫دقت‬duplicate‫کالس‬ ‫از‬ ‫تابعی‬
Rectangle‫نیست‬.
‫گرها‬ ‫اشاره‬(‫ادامه‬)
‫بازگرداننده‬ ‫توابع‬Reference:‫خروجی‬ ‫که‬ ‫میشوند‬ ‫تعریف‬ ‫طوری‬ ‫توابع‬ ‫اوقات‬ ‫گاهی‬
‫جنس‬ ‫از‬ ‫تابع‬Reference‫میشود‬ ‫داده‬ ‫نوع‬ ‫یک‬.‫مثال‬ ‫عنوان‬ ‫به‬:
int& function(int f)
{
f=f+3;
return f;
}
‫تابع‬ ‫این‬ ‫خروجی‬reference‫متغیر‬f‫بود‬ ‫خواهد‬.
‫میشد‬ ‫نوشته‬ ‫فوق‬ ‫مثال‬ ‫در‬ ‫اگر‬return 3;‫یا‬return f + 1;‫خطای‬ ‫با‬ ‫برنامه‬
‫زیرا‬ ‫میشد‬ ‫مواجه‬ ‫کامپایلر‬Reference‫نمیشد‬ ‫بازگردانده‬( .‫باید‬ ‫خروجی‬lvalue
‫باشد‬.)
lvalue:‫گیرد‬ ‫قرار‬ ‫انتساب‬ ‫عملیات‬ ‫یک‬ ‫چپ‬ ‫سمت‬ ‫بتواند‬ ‫که‬ ‫عبارتی‬ ‫به‬lvalue
‫میگویند‬.
rvalue:‫بتواند‬ ‫که‬ ‫عبارتی‬ ‫به‬‫راست‬ ‫سمت‬‫گیرد‬ ‫قرار‬ ‫انتساب‬ ‫عملیات‬ ‫یک‬rvalue
‫میگویند‬.
‫بازگرداننده‬ ‫توابع‬ ‫خاصیت‬Reference‫که‬ ‫است‬ ‫این‬lvalue‫هستند‬.‫میتوان‬ ‫یعنی‬
‫داد‬ ‫نسبت‬ ‫آنها‬ ‫به‬ ‫مقدار‬!!‫داده‬ ‫نسبت‬ ‫رفرنسی‬ ‫به‬ ‫شده‬ ‫داده‬ ‫نسبت‬ ‫مقدار‬
‫تابع‬ ‫که‬ ‫شد‬ ‫خواهد‬return‫میکند‬.
‫ببینید‬ ‫را‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫مثال‬ ‫عنوان‬ ‫به‬:
int* f(int* x) {
(*x)++;
return x;
}
int& g(int& x) {
x++;
return x;
}
int main() {
int a = 0;
cout << *f(&a) << endl; // Ugly (but explicit)
cout << (g(a) = 10) << endl; // Clean (but hidden)
g(a);
cout << a << endl;
}
‫گر‬ ‫اشاره‬void:‫خاطر‬ ‫همین‬ ‫به‬ ،‫میباشد‬ ‫خاص‬ ‫نوعی‬ ‫فاقد‬ ‫که‬ ‫است‬ ‫گری‬ ‫اشاره‬
‫کند‬ ‫اشاره‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫هر‬ ‫به‬ ‫میتواند‬.‫پوی‬ ‫نوع‬ ‫این‬ ‫با‬ ‫کارکردن‬ ‫در‬ ‫که‬ ‫مشکلی‬‫نتر‬
‫را‬ ‫آن‬ ‫نمیتوان‬ ،‫جنس‬ ‫بودن‬ ‫نامشخص‬ ‫علت‬ ‫به‬ ‫که‬ ‫است‬ ‫این‬ ‫دارد‬ ‫وجود‬
dereference‫کرد‬.
‫فرایند‬ ‫خاطر‬ ‫همین‬ ‫به‬dereference‫طریق‬ ‫از‬ ،‫کردن‬casting‫میشود‬ ‫انجام‬.
‫اش‬ ‫دریافت‬ ‫با‬ ‫که‬ ‫بنویسیم‬ ‫میخواهیم‬ ‫تابع‬ ‫یک‬ ‫کنید‬ ‫فرض‬ ‫مثال‬ ‫عنوان‬ ‫به‬‫از‬ ‫گری‬ ‫اره‬
‫دهد‬ ‫افزایش‬ ‫واحد‬ ‫یک‬ ‫را‬ ‫آن‬ ‫مقدار‬ ،‫نامعین‬ ‫نوع‬.
‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
void increaser(void* data, int psize)
{
if (psize == sizeof(char))
{
char* pchar;
pchar = (char*)data;
++(*pchar);
}
else if (psize == sizeof(int))
{
int* pint = (int*)data;
++(*pint);
}
}
int main()
{
char a = 'x';
int b = 1602;
increase(&a, sizeof(a));
increase(&b, sizeof(b));
printf("%ct%dn", a, b);
}
‫گرها‬ ‫اشاره‬ ‫اولیه‬ ‫دهی‬ ‫مقدار‬:
‫سرگردان‬ ‫گر‬ ‫اشاره‬(Wild Pointer):‫اولیه‬ ‫دهی‬ ‫مقدار‬ ‫که‬ ‫میگویند‬ ‫گری‬ ‫اشاره‬ ‫به‬
‫ک‬ ‫و‬ ‫میکند‬ ‫اشاره‬ ‫حافظه‬ ‫در‬ ‫نامعینی‬ ‫فضای‬ ‫به‬ ‫گری‬ ‫اشاره‬ ‫چنین‬ ،‫باشد‬ ‫نشده‬‫با‬ ‫ار‬
‫شود‬ ‫حافظه‬ ‫در‬ ‫ناخواسته‬ ‫تغییرات‬ ‫بروز‬ ‫موجب‬ ‫است‬ ‫ممکن‬ ‫گر‬ ‫اشاره‬ ‫نوع‬ ‫این‬.
int* p; //p is a wild pointer
‫گر‬ ‫اشاره‬null:‫اولی‬ ‫مقداردهی‬ ‫حافظه‬ ‫صفر‬ ‫خانه‬ ‫با‬ ‫که‬ ‫میگویند‬ ‫گری‬ ‫اشاره‬ ‫به‬‫ه‬
‫است‬ ‫شده‬.‫در‬ ‫همواره‬ ‫حافظه‬ ‫صفر‬ ‫خانه‬ ‫چون‬ ‫که‬ ‫است‬ ‫این‬ ‫مقداردهی‬ ‫این‬ ‫دلیل‬
‫در‬ ،‫نمیشود‬ ‫داده‬ ‫ما‬ ‫به‬ ‫آن‬ ‫دسترسی‬ ‫حق‬ ‫هیچگاه‬ ‫و‬ ‫است‬ ‫عامل‬ ‫سیستم‬ ‫اختیار‬
‫از‬ ‫و‬ ‫کرد‬ ‫خواهد‬ ‫اعالم‬ ‫را‬ ‫خطا‬ ‫ما‬ ‫به‬ ‫برنامه‬ ‫ناخواسته‬ ‫های‬ ‫مقداردهی‬ ‫انجام‬ ‫صورت‬
‫شد‬ ‫خواهد‬ ‫جلوگیری‬ ‫ناخواسته‬ ‫تغییرات‬.
int* p = 0; //p is a null pointer
‫ثابتها‬ ‫و‬ ‫گرها‬ ‫اشاره‬:
‫ثابت‬ ‫گر‬ ‫اشاره‬:‫گ‬ ‫اشاره‬ ‫میکند‬ ‫اشاره‬ ‫از‬ ‫حافظه‬ ‫از‬ ‫خانه‬ ‫یک‬ ‫به‬ ‫تنها‬ ‫که‬ ‫گری‬ ‫اشاره‬ ‫به‬‫ر‬
‫است‬ ‫تغییر‬ ‫غیرقابل‬ ‫شونده‬ ‫اشاره‬ ‫آدرس‬ ،‫میگویند‬ ‫ثابت‬.
int n = 45;
int* const cp = &n;
‫یادآوری‬:‫هستند‬ ‫ثابت‬ ‫گر‬ ‫اشاره‬ ‫ها‬ ‫آرایه‬.
‫ثابت‬ ‫به‬ ‫گر‬ ‫اشاره‬:‫تغییر‬ ‫غیرقابل‬ ‫متغیر‬ ‫یک‬ ‫اوقات‬ ‫گاهی‬(const)‫یک‬ ‫و‬ ‫میکنیم‬ ‫تعریف‬
‫میدهیم‬ ‫اشاره‬ ‫آن‬ ‫به‬ ‫را‬ ‫گر‬ ‫اشاره‬.‫تغییرناپذی‬ ‫گر‬ ‫اشاره‬ ‫طریق‬ ‫از‬ ‫ثابت‬ ‫متغیر‬ ‫مقدار‬‫است‬ ‫ر‬.
const int k = 108;
const int* ptc = &k;
‫فوق‬ ‫مثال‬ ‫در‬ ‫کنید‬ ‫دقت‬ptc‫جنس‬ ‫از‬const int*‫جنس‬ ‫از‬ ‫نه‬ ‫میباشد‬int*!!
‫کردن‬ ‫تعریف‬ ‫صورت‬ ‫در‬ptc‫نوع‬ ‫از‬int*‫میشدیم‬ ‫مواجه‬ ‫مشکل‬ ‫با‬( .‫چرا؟‬)!
‫تابع‬ ‫به‬ ‫گر‬ ‫اشاره‬:
•‫است‬ ‫ثابت‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ،‫آرایه‬ ‫یک‬ ‫نام‬ ‫همانند‬ ‫تابع‬ ‫یک‬ ‫نام‬.
•‫قسمت‬ ‫آن‬ ‫در‬ ‫تابع‬ ‫درون‬ ‫کدهای‬ ‫که‬ ‫میدهد‬ ‫نشان‬ ‫را‬ ‫حافظه‬ ‫از‬ ‫آدرسی‬ ،‫تابع‬ ‫نام‬
‫اند‬ ‫گرفته‬ ‫جای‬.
•‫که‬ ‫است‬ ‫این‬ ‫مانند‬ ‫شود‬ ‫تعریف‬ ‫تابع‬ ‫به‬ ‫گری‬ ‫اشاره‬ ‫اگر‬ ‫بنابراین‬:
‫ثابت‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ‫به‬ ‫گری‬ ‫اشاره‬‫است‬ ‫شده‬ ‫تعریف‬.
#include <iostream>
using namespace std;
void error(char* s) { cout << s << endl; }
int main() {
void(*f1)(char*) = &error; //ok
void(*f2)(char*) = error; // also ok; same meaning as &error
f1("f1 function without dereference."); //ok
(*f1)("f1 function with dereference."); //also ok
f2("f2 function without dereference.");
(*f2)("f2 function with dereference."); //also ok
}
‫فایلها‬ ‫با‬ ‫کار‬
‫انجام‬ ‫برای‬ ‫ما‬ ‫های‬ ‫برنامه‬ ‫االن‬ ‫تا‬I/O‫کتابخانه‬ ‫از‬iostream‫میکردند‬ ‫استفاده‬.
‫نام‬ ‫به‬ ‫کالسی‬ ‫با‬ ‫االن‬ ‫اما‬fstream‫تع‬ ‫فایلها‬ ‫با‬ ‫کردن‬ ‫کار‬ ‫برای‬ ‫که‬ ‫میشویم‬ ‫آشنا‬‫بیه‬
‫است‬ ‫شده‬.
‫است‬ ‫زیر‬ ‫شرح‬ ‫به‬ ‫کالس‬ ‫زیر‬ ‫دو‬ ‫دارای‬ ‫کالس‬ ‫این‬:
•Ifstream:‫فایل‬ ‫از‬ ‫ورودی‬ ‫خواندن‬ ‫برای‬ ‫کالسی‬
•Ofstream:‫آن‬ ‫روی‬ ‫بر‬ ‫نوشتن‬ ‫و‬ ‫فایل‬ ‫ایجاد‬ ‫برای‬ ‫کالسی‬
‫های‬ ‫کتابخانه‬ ‫باید‬ ‫کالسها‬ ‫این‬ ‫از‬ ‫استفاده‬ ‫برای‬iostream‫و‬fstream‫برنامه‬ ‫در‬ ‫را‬
‫خود‬include‫کنید‬.
// writing on a text file
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream myfile("example.txt"); // if no file exists, create one
// ofstream myfile; myfile.open("example.txt");
if (myfile.is_open())
{
myfile << "This is a line.n";
myfile << "This is another line.n";
myfile.close(); // close the stream
}
else cout << "Unable to open file";
return 0;
}
// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
string line;
ifstream myfile("example.txt");
if (myfile.is_open())
{
// getline returns 0 when there is nothing to read
while (getline(myfile, line)) // reading a line from myfile stream
cout << line << 'n';
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
‫اطال‬ ،‫فایل‬ ‫یک‬ ‫روی‬ ‫بر‬ ‫نوشتن‬ ‫هنگام‬ ‫که‬ ‫داریم‬ ‫تصمیم‬ ‫مواقع‬ ‫از‬ ‫بسیاری‬ ‫در‬‫عات‬
‫فایل‬ ‫به‬ ‫جدید‬ ‫اطالعات‬ ‫و‬ ‫ندهیم‬ ‫دست‬ ‫از‬ ‫را‬ ‫قبلی‬append‫شوند‬.‫چنین‬ ‫در‬
‫کردن‬ ‫باز‬ ‫هنگام‬ ‫مواقعی‬stream،mode‫میکنیم‬ ‫مشخص‬ ‫نیز‬ ‫را‬ ‫عملیات‬.
Open_Mode Flag ‫توضیحات‬
ios::app ‫هرچه‬،‫شود‬ ‫نوشته‬ ‫فایل‬ ‫این‬ ‫در‬‫فقط‬‫به‬
‫شد‬ ‫خواهد‬ ‫افزوده‬ ‫آن‬ ‫انتهای‬.
ios::ate ،‫نوشتن‬ ‫و‬ ‫خواندن‬ ‫گر‬ ‫اشاره‬‫فایل‬ ‫انتهای‬ ‫به‬
‫شود‬ ‫می‬ ‫منتقل‬.
ios::binary ‫تمامی‬‫صورت‬ ‫به‬ ‫فایل‬ ‫در‬ ‫موجود‬ ‫مقادیر‬
‫میشوند‬ ‫گرفته‬ ‫نظر‬ ‫در‬ ‫باینری‬ ‫مقادیر‬.
ios::in ‫فایل‬‫است‬ ‫شده‬ ‫باز‬ ‫خواندن‬ ‫برای‬.
ios::out ‫برای‬ ‫فایل‬‫است‬ ‫شده‬ ‫باز‬ ‫نوشتن‬.
ios::trunc ‫اگر‬‫قبلی‬ ‫اطالعات‬ ‫تمامی‬ ،‫داشت‬ ‫وجود‬ ‫فایل‬
‫شد‬ ‫خواهد‬ ‫حذف‬ ‫آن‬.
// Copying a file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream f1("input.txt", ios::binary);
ofstream f2("output.txt", ios::trunc | ios ::binary);
f2 << f1.rdbuf(); // read f1's buffer, write it in f2
return 0;
}
File-Position Pointers:،‫نوشتن‬ ‫یا‬ ‫خواندن‬ ‫صورت‬ ‫در‬ ‫میکند‬ ‫بیان‬ ‫که‬ ‫است‬ ‫گری‬ ‫اشاره‬
‫شود‬ ‫نوشته‬ ‫یا‬ ‫خوانده‬ ‫باید‬ ‫فایل‬ ‫کجای‬.
‫دارند‬ ‫وجود‬ ‫گرها‬ ‫اشاره‬ ‫این‬ ‫جابجایی‬ ‫برای‬ ‫زیر‬ ‫دستور‬ ‫دو‬:
•seekg (seek-get):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬ ‫را‬istream‫جابجا‬
‫میکند‬.
•tellg (tell-get):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬istream‫اعالم‬ ‫را‬
‫میکند‬.
•seekp (seek-put):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬ ‫را‬ostream‫جابجا‬
‫میکند‬.
•tellp (tell-put):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬ostream‫اعالم‬ ‫را‬
‫میکند‬.
‫روی‬ ‫بر‬ ‫دهی‬ ‫آدرس‬ ‫برای‬ ‫هم‬ ‫زیر‬ ‫گر‬ ‫اشاره‬ ‫سه‬stream‫دارند‬ ‫وجود‬:
‫گر‬ ‫اشاره‬ ‫نام‬ ‫گر‬ ‫اشاره‬ ‫مکان‬
ios::beg stream ‫ابتدای‬
ios::cur File-Position Pointer ‫فعلی‬ ‫مکان‬
ios::end stream ‫انتهای‬
‫دستور‬ ‫با‬ ‫کردن‬ ‫کار‬ ‫راهنمای‬seek:
// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg(n);
// position n bytes forward in fileObject
fileObject.seekg(n, ios::cur);
// position n bytes back from end of fileObject
fileObject.seekg(n, ios::end);
// position at end of fileObject
fileObject.seekg(0, ios::end);
// obtaining file size
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
streampos begin, end; // data type = File-Position Pointer
ifstream myfile("example.bin", ios::binary);
begin = myfile.tellg();
myfile.seekg(0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size is: " << (end - begin) << " bytes.n";
return 0;
}
Namespaces
‫توابع‬ ‫و‬ ‫ها‬ ‫کالس‬ ،‫متغیرها‬ ‫کدام‬ ‫هر‬ ‫در‬ ‫که‬ ‫هستند‬ ‫برنامه‬ ‫از‬ ‫مجزایی‬ ‫قسمتهای‬
‫اند‬ ‫شده‬ ‫سازی‬ ‫پیاده‬ ‫و‬ ‫تعریف‬ ‫خاص‬ ‫هدفی‬ ‫با‬ ‫متناسب‬.
‫هر‬ ‫اجزای‬namespace‫هستند‬ ‫دسترسی‬ ‫قابل‬ ‫شکل‬ ‫دو‬ ‫به‬ ‫تنها‬:
•‫همان‬ ‫داخل‬namespace
•‫آن‬ ‫از‬ ‫استفاده‬ ‫اعالم‬ ‫صورت‬ ‫در‬namespace(‫دستور‬ ‫از‬ ‫استفاده‬using)
•‫به‬ ‫جزء‬ ‫آن‬ ‫دادن‬ ‫نسبت‬ ‫صورت‬ ‫در‬namespace‫برنامه‬ ‫در‬ ‫شده‬ ‫شناخته‬
(‫عملگر‬ ‫از‬ ‫استفاده‬::‫دسترسی‬ ‫برای‬)
Namespace‫زبان‬ ‫در‬ ‫ها‬C++‫مشابه‬package‫در‬Java‫باشند‬ ‫می‬.‫که‬ ‫تفاوت‬ ‫این‬ ‫با‬
package‫ها‬flat‫اما‬ ‫هستند‬namespace‫میتوانند‬ ‫ها‬nested‫باشند‬.
#include <iostream>
using namespace std;
namespace foo
{
int value() { return 5; }
}
namespace bar
{
const double pi = 3.1416;
double value() { return 2 * pi; }
}
int main()
{
cout << foo::value() << 'n'; // accessing foo's value()
cout << bar::value() << 'n'; // accessing bar's value()
cout << bar::pi << 'n';
return 0;
}
#include <iostream>
using namespace std;
namespace first{
int x = 5;
int y = 10;
}
namespace second {
double x = 3.1416;
double y = 2.7183;
}
int main() {
using first::x;
using second::y;
cout << x << 'n';
cout << y << 'n';
cout << first::y << 'n';
cout << second::x << 'n';
return 0;
}
‫مثال‬:‫چیست؟‬ ‫زیر‬ ‫کد‬ ‫خروجی‬
http://paste.ubuntu.com/23788331/
‫ورودی‬:
5 4
1 2
2 3
1 3
4 5
‫خروجی‬:2
‫مثال‬:‫چیست؟‬ ‫زیر‬ ‫کد‬ ‫خروجی‬
#include <iostream>
using namespace std;
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
namespace second_space {
void func(){
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main() {
func();
return 0;
}
Preprocessor Directives (Macros)
Directive‫کامپایلر‬ ‫برای‬ ‫مفهومشان‬ ‫کامپایل‬ ‫روند‬ ‫در‬ ‫که‬ ‫هستند‬ ‫عباراتی‬ ‫ها‬
‫است‬ ‫شده‬ ‫مشخص‬.‫عبارات‬ ‫این‬‫زبان‬ ‫در‬C++‫عالمت‬ ‫از‬ ‫بعد‬ ‫همیشه‬#‫آیند‬ ‫می‬.
‫شوند‬ ‫می‬ ‫بررسی‬ ‫کامپایل‬ ‫فرآیند‬ ‫شروع‬ ‫از‬ ‫قبل‬ ‫همواره‬ ‫عبارات‬ ‫این‬.
‫مشهورترین‬directive‫عبارت‬ ،‫اید‬ ‫دیده‬ ‫حال‬ ‫به‬ ‫تا‬ ‫که‬include‫میباشد‬.‫در‬ ‫که‬
‫کتابخا‬ ‫چه‬ ‫به‬ ‫نیاز‬ ‫کامپایل‬ ‫از‬ ‫قبل‬ ‫میشود‬ ‫متوجه‬ ‫کامپایلر‬ ،‫اولیه‬ ‫بررسی‬‫هایی‬ ‫نه‬
‫دارد‬.‫دیگر‬ ‫از‬directive‫به‬ ‫میتوان‬ ‫ها‬define،ifdef،endif‫و‬...‫کرد‬ ‫اشاره‬.
define:‫کن‬ ‫تعریف‬ ‫کامپایلر‬ ‫برای‬ ‫را‬ ‫عبارت‬ ‫این‬.
ifdef:‫بود‬ ‫شده‬ ‫تعریف‬ ‫کامپایلر‬ ‫برای‬ ‫اگر‬.
ifndef::‫بود‬ ‫نشده‬ ‫تعریف‬ ‫کامپایلر‬ ‫برای‬ ‫اگر‬.
endif:‫شرط‬ ‫پایان‬
#include <iostream>
using namespace std;
#define getmax(a,b) ((a)>(b)?(a):(b))
#define x 5
int main()
{
int y;
y = getmax(x, 2);
cout << y << endl;
cout << getmax(7, x) << endl;
return 0;
}
‫از‬ ‫باید‬ ‫کتابخانه‬ ‫یک‬ ‫دوباره‬ ‫کردن‬ ‫تعریف‬ ‫از‬ ‫جلوگیری‬ ‫برای‬ ،‫ای‬ ‫کتابخانه‬ ‫فایلهای‬ ‫نوشتن‬ ‫هنگام‬ ‫در‬directive‫کرد‬ ‫استفاده‬ ‫شرطی‬ ‫های‬.
// add.h
#ifndef ADD_H // if not defined
#define ADD_H // then define
int add(int x, int y);
#endif // conditional statement finished
-------------------------------
// add.cpp
int add(int x, int y) {
return x + y;
}
--------------------------------
// main.cpp
#include <iostream>
#include "add.h"
int main() {
std::cout << "The sum of 3 and 4 is " << add(3, 4) << std::endl;
return 0;
}
‫از‬ ‫دیگر‬ ‫یکی‬directive،‫نویسی‬ ‫برنامه‬ ‫در‬ ‫پرکاربرد‬ ‫های‬pragma‫باشد‬ ‫می‬.‫این‬
directive‫کند‬ ‫ایجاد‬ ‫کامپایل‬ ‫نحوه‬ ‫در‬ ‫تغییراتی‬ ‫میتواند‬.‫این‬ ،‫مثال‬ ‫عنوان‬ ‫به‬
directive‫برای‬ ‫بیشتری‬ ‫حجم‬ ‫که‬ ‫کند‬ ‫اعالم‬ ‫کامپایلر‬ ‫به‬ ‫میتواند‬stack‫نظر‬ ‫در‬
‫بگیرد‬.
‫استاندارد‬ ‫ماکروهای‬:‫آنها‬ ‫کمک‬ ‫به‬ ‫و‬ ‫هستند‬ ‫شده‬ ‫تعریف‬ ‫همواره‬ ‫ماکروها‬ ‫این‬
‫کرد‬ ‫دریافت‬ ‫میتوان‬ ‫سیستم‬ ‫از‬ ‫را‬ ‫اطالعاتی‬.
#include <iostream>
using namespace std;
int main() {
cout << "This is the line number " << __LINE__;
cout << " of file " << __FILE__ << ".n";
cout << "Its compilation began " << __DATE__;
cout << " at " << __TIME__ << ".n";
return 0;
}
‫داده‬ ‫دیگر‬ ‫انواع‬
‫ماسک‬‫ها‬ ‫داده‬ ‫نوع‬:‫برای‬ ‫دیگری‬ ‫اسامی‬ ‫از‬ ‫میتوان‬ ‫اوقات‬ ‫گاهی‬DataType‫ها‬
‫کرد‬ ‫اعالن‬ ‫میتوان‬ ‫روش‬ ‫چندین‬ ‫به‬ ‫را‬ ‫اسامی‬ ‫این‬ ،‫کرد‬ ‫استفاده‬:
•‫ماکروها‬
•using
•typedef
#define C char
using C = char;
typedef char C;
Union:‫شبیه‬ ‫داده‬ ‫نوع‬ ‫این‬struct‫و‬class‫که‬ ‫تفاوت‬ ‫این‬ ‫با‬ ،‫میباشد‬:
•‫ندارد‬ ‫تابع‬.
•‫میشود‬ ‫گذاشته‬ ‫اشتراک‬ ‫به‬ ‫آن‬ ‫متغیرهای‬ ‫همه‬ ‫بین‬ ‫استفاده‬ ‫قابل‬ ‫حافظه‬.‫حا‬ ‫این‬‫فظه‬
‫متغیر‬ ‫ترین‬ ‫پرحجم‬ ‫اندازه‬ ‫به‬Union‫است‬.
union mix_t
{
int l; // 4 bytes
struct {
short hi; // 2 bytes
short lo; // 2 bytes
} s; // 4 bytes
char c[4]; // 4 bytes
} mix;
Operator Overloading
‫و‬ ‫کرد‬ ‫تعریف‬ ‫ساختارها‬ ‫برای‬ ‫را‬ ‫عملگرها‬ ‫میشود‬ ‫نیاز‬ ‫گاهی‬ ‫نویسی‬ ‫برنامه‬ ‫در‬‫آن‬
‫زبان‬ ،‫کرد‬ ‫سازی‬ ‫پیاده‬ ‫نویس‬ ‫برنامه‬ ‫نظر‬ ‫مورد‬ ‫شیوه‬ ‫به‬ ‫را‬ ‫عملگر‬C++‫برنامه‬ ‫به‬
‫میش‬ ‫آشنا‬ ‫اپراتورها‬ ‫این‬ ‫با‬ ‫که‬ ‫میدهد‬ ‫را‬ ‫اپراتورها‬ ‫گذاری‬ ‫سربار‬ ‫امکان‬ ‫نویسان‬‫ویم‬
(‫بگیرید‬ ‫نظر‬ ‫در‬ ‫توابع‬ ‫مانند‬ ‫را‬ ‫اپراتورها‬ ‫میتوانید‬ ‫مطلب‬ ‫آسانتر‬ ‫فهم‬ ‫برای‬)
‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
class Ratio
{
public:
Ratio() : num(0), den(1) {}
Ratio(int n, int d) : num(n), den(d) {}
Ratio(const Ratio& r) {
num = r.num;
den = r.den;
}
void showRatio() const {
cout << num << " numt" << den << " denn";
}
const Ratio& operator=(const Ratio&);
private:
int num, den;
};
const Ratio& Ratio::operator=(const Ratio& r) {
num = r.num;
den = r.den;
return *this;
}
int main() {
Ratio c1(12, 7);
Ratio c4, c5, c6, c3 = c1, c2(c1);
c5.operator = (c2);
c4 = c6 = c2;
c1.showRatio();
c2.showRatio();
c3.showRatio();
c4.showRatio();
c5.showRatio();
c6.showRatio();
}
Copy Constructor:‫کپی‬ ‫یک‬ ‫و‬ ‫کند‬ ‫دریافت‬ ‫را‬ ‫جنس‬ ‫همان‬ ‫از‬ ‫شی‬ ‫یک‬ ‫که‬ ‫ای‬ ‫سازنده‬ ‫به‬
‫بسازد‬ ‫را‬ ‫آن‬ ‫از‬Copy Constructor‫گویند‬ ‫می‬.‫مشاهده‬ ‫را‬ ‫آن‬ ‫فراخوانی‬ ‫زیر‬ ‫عبارت‬ ‫در‬
‫میکنید‬:
Ratio c2(c1); //Copy Constructor
‫سوال‬:‫زیر‬ ‫امضای‬ ‫با‬ ‫را‬ ‫انتساب‬ ‫اپراتور‬ ‫اگر‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫در‬overload‫چه‬ ‫میکردیم‬
‫افتاد؟‬ ‫می‬ ‫اتفاقی‬
void operator=(const Ratio&);
‫پاسخ‬:‫دستور‬ ‫با‬ ‫مواجهه‬ ‫هنگام‬ ‫در‬ ‫برنامه‬c4 = c6 = c2;‫زیرا‬ ‫میشد‬ ‫مشکل‬ ‫دچار‬
‫انتساب‬ ‫از‬ ‫اپراتور‬ ‫این‬ ‫که‬ ‫مقداری‬c2‫به‬c6‫متغیر‬ ‫در‬ ،‫برمیگرداند‬c4‫میشود‬ ‫داده‬ ‫قرار‬.
‫سوال‬:،‫میشد‬ ‫نوشته‬ ‫اگر‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫در‬(c4 = c6) = c2‫افتاد؟‬ ‫می‬ ‫اتفاقی‬ ‫چه‬
‫پاسخ‬:‫میشد‬ ‫مواجه‬ ‫خطا‬ ‫با‬ ‫برنامه‬( .‫ثابت‬ ‫به‬ ‫مقداردهی‬)
class Counter
{
private:
unsigned int count;
public:
Counter() : Counter(0) {
cout << "No Arg Constructor" << endl;
}
Counter(int c) : count(c) {
cout << "One Arg Constructor" << endl;
}
Counter(const Counter& r) {
cout << "Copy Constrctor" << endl;
count = r.count;
}
unsigned int get_count() const {
return count;
}
Counter& operator ++ () {
++count;
return *this;
}
Counter& operator ++ (int) {
Counter temp = *this;
count++;
return temp;
}
};
int main()
{
Counter c1, c2;
cout << "nc1=" << c1.get_count();
cout << "nc2=" << c2.get_count();
++c1;
c2 = ++c1;
cout << "nc1=" << c1.get_count();
cout << "nc2=" << c2.get_count();
c2 = c1++;
++++++c2;
cout << "nc1=" << c1.get_count();
cout << "nc2=" << c2.get_count();
return 0;
}
‫تذکر‬:‫که‬ ‫توابعی‬ ‫بازگشتی‬ ‫مقدار‬ ‫عنوان‬ ‫به‬ ‫نمیتوان‬ ‫را‬ ‫محلی‬ ‫شی‬ ‫یک‬Type&
‫گرفت‬ ‫نظر‬ ‫در‬ ‫برمیگردانند‬.‫ر‬ ‫خواهد‬ ‫بین‬ ‫از‬ ،‫تابع‬ ‫از‬ ‫بازگشت‬ ‫از‬ ‫پس‬ ‫شی‬ ‫زیرا‬‫و‬ ‫فت‬
Reference‫بود‬ ‫نخواهد‬ ‫معتبر‬ ‫آن‬ ‫به‬.
‫سوال‬:‫عبارت‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫در‬const‫دارد؟‬ ‫تاثیری‬ ‫چه‬
unsigned int get_count() const
‫پاسخ‬:get_count‫صورت‬ ‫به‬const member function‫میشود‬ ‫تعریف‬.‫چنین‬
‫نمیتواند‬ ‫همچنین‬ ،‫ندارد‬ ‫خود‬ ‫در‬ ‫را‬ ‫ثابت‬ ‫غیر‬ ‫توابع‬ ‫فراخوانی‬ ‫توانایی‬ ‫تابعی‬‫مقدار‬
‫دهد‬ ‫تغییر‬ ‫را‬ ‫کالس‬ ‫متغیرهای‬.‫ای‬ ‫تنها‬ ،‫بسازیم‬ ‫کالس‬ ‫از‬ ‫ثابت‬ ‫شی‬ ‫یک‬ ‫اگر‬‫نوع‬ ‫ن‬
‫کرد‬ ‫فراخوانی‬ ‫آن‬ ‫برای‬ ‫میتوان‬ ‫را‬ ‫توابع‬.
‫کنید‬ ‫دقت‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
class A
{
public:
void Const_No(); // nonconst member function
void Const_Yes() const; // const member function
};
int main()
{
A obj_nonconst; // nonconst object
obj_nonconst.Const_No(); // works fine
obj_nonconst.Const_Yes(); // works fine
const A obj_const = A(); // const object
obj_const.Const_Yes(); // works fine (const object can call const function)
obj_const.Const_No(); // ERROR (const object cannot call nonconst function)
}
‫به‬ ‫متعلق‬ ‫که‬ ‫کنیم‬ ‫سربارگذاری‬ ‫طوری‬ ‫را‬ ‫اپراتورها‬ ‫بخواهیم‬ ‫است‬ ‫ممکن‬ ‫حال‬
‫دهند‬ ‫انجام‬ ‫عملیات‬ ‫متغیر‬ ‫دو‬ ‫روی‬ ‫بر‬ ‫یا‬ ‫و‬ ‫نباشند‬ ‫خاصی‬ ‫کالس‬(‫عملگ‬ ‫همانند‬‫ر‬)+
‫کنید‬ ‫دقت‬ ‫زیر‬ ‫لینک‬ ‫در‬ ‫موجود‬ ‫کد‬ ‫به‬( :‫قرار‬ ‫اینجا‬ ‫در‬ ‫کد‬ ‫باالی‬ ‫حجم‬ ‫علت‬ ‫به‬
‫نگرفت‬)
http://paste.ubuntu.com/13237504/
Templates
‫قالبها‬(Templates)‫کد‬ ‫آن‬ ‫در‬ ‫که‬ ‫باشند‬ ‫می‬ ‫جنریک‬ ‫نویسی‬ ‫برنامه‬ ‫گذار‬ ‫بنیان‬
‫شود‬ ‫می‬ ‫اجرا‬ ‫خاصی‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫از‬ ‫مستقل‬.‫هستن‬ ‫توابعی‬ ‫یا‬ ‫ها‬ ‫کالس‬ ‫قالبها‬‫د‬
‫کنند‬ ‫می‬ ‫کار‬ ‫مختلف‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫با‬ ‫که‬.
‫شوند‬ ‫می‬ ‫تقسیم‬ ‫دسته‬ ‫دو‬ ‫به‬ ‫قالبها‬:
•FunctionTemplates:‫به‬ ‫را‬ ‫متعددی‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫هر‬ ‫توانند‬ ‫می‬ ‫که‬ ‫توابعی‬
‫کنند‬ ‫دریافت‬ ‫ورودی‬ ‫پارامتر‬ ‫عنوان‬.
•ClassTemplates:‫کار‬ ‫به‬ ‫متعددی‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫داری‬ ‫نگه‬ ‫برای‬ ‫که‬ ‫هایی‬ ‫کالس‬
‫روند‬ ‫می‬.
FunctionTemplates
‫کن‬ ‫دریافت‬ ‫همجنس‬ ‫ورودی‬ ‫دو‬ ‫که‬ ‫بنویسید‬ ‫تابعی‬ ‫میخواهید‬ ‫که‬ ‫کنید‬ ‫فرض‬‫و‬ ‫د‬
‫م‬ ‫این‬ ‫بتواند‬ ‫تابع‬ ‫این‬ ‫میخواهید‬ ‫کنید‬ ‫فرض‬ ‫حال‬ ،‫برگرداند‬ ‫را‬ ‫بزرگتر‬ ‫ورودی‬‫را‬ ‫قایسه‬
‫ای‬ ‫داده‬ ‫انواع‬ ‫برای‬int،char‫و‬double‫دهد‬ ‫انجام‬.‫از‬ ‫استفاده‬ ‫عدم‬ ‫صورت‬ ‫در‬
Template‫سه‬ ‫باید‬ ‫شما‬ ،overload‫تابع‬ ‫برای‬ ‫مختلف‬max‫بنویسید‬.‫صورت‬ ‫در‬ ‫اما‬
‫از‬ ‫استفاده‬FunctionTemplate‫برای‬ ‫نوشت‬ ‫خواهید‬ ‫را‬ ‫تابع‬ ‫این‬ ‫بار‬ ‫یک‬ ‫تنها‬ ‫شما‬ ،
‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫مثال‬ ‫به‬ ‫موضوع‬ ‫این‬ ‫بهتر‬ ‫درک‬:
#include <iostream>
using namespace std;
template <typename Type> // this is the template parameter declaration
Type Max(Type tX, Type tY)
{
return (tX > tY) ? tX : tY;
}
int main()
{
int nValue = Max <int> (3, 7); // returns 7 [Same as Max(3,7)]
double dValue = Max(6.34, 18.523); // returns 18.523
char chValue = Max('a', '6'); // returns 'a'
}
‫نام‬ ‫به‬ ‫فرضی‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫یک‬ ‫مثال‬ ‫این‬ ‫در‬Type‫سازی‬ ‫پیاده‬ ‫تابع‬ ‫کلی‬ ‫ماهیت‬ ‫آن‬ ‫کمک‬ ‫به‬ ‫که‬ ‫است‬ ‫شده‬ ‫تعریف‬
‫یک‬ ‫را‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫سایر‬ ‫میتواند‬ ‫تابع‬ ‫این‬ ‫حال‬ ،‫است‬ ‫شده‬Type‫دهد‬ ‫انجام‬ ‫نیز‬ ‫آنها‬ ‫برای‬ ‫را‬ ‫عملیات‬ ‫این‬ ‫و‬ ‫کند‬ ‫فرض‬.
ClassTemplates
ClassTemplate‫جنس‬ ‫از‬ ‫متغیرهایی‬ ‫یا‬ ‫توابع‬ ‫که‬ ‫هستند‬ ‫کالسهایی‬ ‫ها‬Type
‫دارند‬ ‫شده‬ ‫تعریف‬ ‫فرضی‬.‫د‬ ‫ساختمان‬ ‫خواهید‬ ‫می‬ ‫کنید‬ ‫فرض‬ ‫نمونه‬ ‫عنوان‬ ‫به‬‫اده‬
Stack‫جنس‬ ‫از‬ ‫متغیر‬ ‫چندین‬ ‫نیاز‬ ‫برحسب‬ ‫است‬ ‫ممکن‬ ‫اما‬ ‫کنید‬ ‫سازی‬ ‫پیاده‬ ‫را‬
Stack‫حاوی‬ ‫آنها‬ ‫از‬ ‫یکی‬ ‫که‬ ‫بسازید‬int‫حاوی‬ ‫دیگر‬ ‫یکی‬ ،double‫حاوی‬ ‫دیگری‬ ‫و‬
string‫باشد‬.‫س‬ ‫که‬ ‫است‬ ‫این‬ ‫ابتدایی‬ ‫راه‬ ‫یک‬ ‫کنید؟‬ ‫می‬ ‫چه‬ ‫کار‬ ‫این‬ ‫انجام‬ ‫برای‬‫ه‬
‫کالس‬ ‫بار‬Stack‫کنید‬ ‫سازی‬ ‫پیاده‬ ‫را‬ ‫آن‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫هر‬ ‫برای‬ ‫هربار‬ ‫و‬ ‫بنویسید‬ ‫را‬.
‫سازی‬ ‫پیاده‬ ،‫باشد‬ ‫می‬ ‫بهینه‬ ‫راه‬ ‫که‬ ‫دیگر‬ ‫راه‬Stack‫عنوان‬ ‫به‬ClassTemplate
‫باشد‬ ‫می‬.‫کار‬ ‫ای‬ ‫داده‬ ‫فیلدهای‬ ‫تمامی‬ ‫با‬ ‫که‬ ‫دارد‬ ‫را‬ ‫این‬ ‫قابلیت‬ ‫ساختار‬ ‫این‬‫کند‬.
‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬ ‫مثال‬ ‫این‬ ‫بهتر‬ ‫درک‬ ‫برای‬:
‫مثال‬:‫چیست؟‬ ‫زیر‬ ‫کد‬ ‫خروجی‬
http://paste.ubuntu.com/15197774/
‫منابع‬:
• http://www.cplusplus.com/doc/tutorial/
• http://www.tutorialspoint.com/cplusplus/
• http://stackoverflow.com/
• http://www.cprogramming.com/tutorial/
• ‫پاییز‬ ‫پیشرفته‬ ‫سازی‬ ‫برنامه‬ ‫اسالیدهای‬91‫بهشتی‬ ‫شهید‬ ‫دانشگاه‬
• ‫نویسی‬ ‫برنامه‬ ‫و‬ ‫کامپیوتر‬ ‫مبانی‬ ‫اسالیدهای‬‫پاییز‬93‫بهشتی‬ ‫شهید‬ ‫دانشگاه‬

More Related Content

Similar to سی پلاس پلاس به عنوان زبان دومی برای یادگیری شی گرایی

آشنایی با زبان جاوا - مقدماتی اندروید
آشنایی با زبان جاوا - مقدماتی اندرویدآشنایی با زبان جاوا - مقدماتی اندروید
آشنایی با زبان جاوا - مقدماتی اندرویدSadegh Ghanbari Shohani
 
Introduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیراز
Introduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیرازIntroduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیراز
Introduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیرازMobin Ranjbar
 
1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهران
1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهران1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهران
1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهرانFarafekr Technology
 
متغیرهای
متغیرهایمتغیرهای
متغیرهایHazar Mir
 
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...aminnezarat
 
2 arrays in c++ programming aramse
2  arrays in c++ programming  aramse2  arrays in c++ programming  aramse
2 arrays in c++ programming aramseAram SE
 
Oracle Data Integrator (persian)
Oracle Data Integrator (persian)Oracle Data Integrator (persian)
Oracle Data Integrator (persian)Ehsan Hamzei
 
Java programming languages
Java programming languagesJava programming languages
Java programming languagesjavadib
 
(ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
 (ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ... (ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
(ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...Muhibullah Aman
 

Similar to سی پلاس پلاس به عنوان زبان دومی برای یادگیری شی گرایی (20)

آشنایی با زبان جاوا - مقدماتی اندروید
آشنایی با زبان جاوا - مقدماتی اندرویدآشنایی با زبان جاوا - مقدماتی اندروید
آشنایی با زبان جاوا - مقدماتی اندروید
 
Introduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیراز
Introduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیرازIntroduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیراز
Introduction to Hadoop and Spark - اسلاید کارگاه آموزش هدوپ و اسپارک شیراز
 
1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهران
1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهران1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهران
1st Hadoop Tehran Workshop - اسلاید اولین کارگاه آموزش هدوپ تهران
 
متغیرهای
متغیرهایمتغیرهای
متغیرهای
 
Lecture2
Lecture2Lecture2
Lecture2
 
Amjadi - Ebook 5 - Function - v1
Amjadi - Ebook 5 - Function - v1Amjadi - Ebook 5 - Function - v1
Amjadi - Ebook 5 - Function - v1
 
Sql tuning
Sql tuningSql tuning
Sql tuning
 
C++
C++C++
C++
 
C++
C++C++
C++
 
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...
 
Pg autoscaling in ceph
Pg autoscaling in  cephPg autoscaling in  ceph
Pg autoscaling in ceph
 
2 arrays in c++ programming aramse
2  arrays in c++ programming  aramse2  arrays in c++ programming  aramse
2 arrays in c++ programming aramse
 
how enable ceph dashboard
how enable  ceph dashboardhow enable  ceph dashboard
how enable ceph dashboard
 
Oracle Data Integrator (persian)
Oracle Data Integrator (persian)Oracle Data Integrator (persian)
Oracle Data Integrator (persian)
 
Java programming languages
Java programming languagesJava programming languages
Java programming languages
 
rbdmap in ceph
rbdmap in ceph rbdmap in ceph
rbdmap in ceph
 
Rbdmap ceph realease 0.2
Rbdmap ceph realease 0.2Rbdmap ceph realease 0.2
Rbdmap ceph realease 0.2
 
MongoDB
MongoDBMongoDB
MongoDB
 
lunch box plugin
 lunch box plugin  lunch box plugin
lunch box plugin
 
(ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
 (ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ... (ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
(ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
 

سی پلاس پلاس به عنوان زبان دومی برای یادگیری شی گرایی

  • 1. ‫خدا‬ ‫نام‬ ‫به‬ ‫به‬ ‫پیشرفته‬ ‫نویسی‬ ‫برنامه‬ ‫بر‬ ‫مروری‬ ‫دیگر‬ ‫زبانی‬ ‫در‬ ‫مقدماتی‬ ‫گرایی‬ ‫شی‬ ‫آموزش‬C++ ‫کننده‬ ‫تهیه‬:‫محسنی‬ ‫محمدرضا‬
  • 2. ‫چرا‬C++‫؟‬ •‫افزار‬ ‫سخت‬ ‫نویسی‬ ‫برنامه‬:‫زبان‬ ‫بودن‬ ‫نزدیکتر‬ ‫علت‬ ‫به‬C++ ‫پایین‬ ‫سطح‬ ‫نویسی‬ ‫برنامه‬ ‫برای‬ ‫غالبا‬ ،‫افزار‬ ‫سخت‬ ‫زبان‬ ‫به‬ (‫درایورها‬ ‫نوشتن‬ ‫مانند‬)‫شود‬ ‫می‬ ‫استفاده‬ ‫زبان‬ ‫این‬ ‫از‬. •‫باال‬ ‫قدرت‬:‫زبان‬ ‫که‬ ‫آنجا‬ ‫از‬C++‫اشاره‬ ‫مانند‬ ‫هایی‬ ‫قابلیت‬ ‫را‬ ‫کارها‬ ‫از‬ ‫بسیاری‬ ‫انجام‬ ،‫دارد‬ ‫را‬ ‫حافظه‬ ‫مدیریت‬ ‫و‬ ‫گرها‬ ‫میکند‬ ‫ممکن‬. •‫باال‬ ‫سرعت‬:‫کدهای‬C++‫پایتون‬ ‫و‬ ‫جاوا‬ ‫کدهای‬ ‫از‬ ‫سریعتر‬ ‫هستند‬.‫که‬ ‫کنید‬ ‫می‬ ‫مشاهده‬ ‫بعد‬ ‫صفحه‬ ‫جدول‬ ‫در‬ ‫مثال‬ ‫برای‬ ‫زبان‬ ‫دو‬ ‫در‬ ‫یکسان‬ ‫کد‬ ‫دو‬C++‫زمان‬ ‫اختالف‬ ‫مقدار‬ ‫چه‬ ‫جاوا‬ ‫و‬ ‫داشته‬ ‫اجرا‬:
  • 3. •‫کار‬ ‫بازار‬ ‫در‬ ‫باال‬ ‫درآمد‬:‫حقوق‬ ‫معموال‬ ،‫شرکت‬ ‫یک‬ ‫در‬ ‫نویس‬ ‫برنامه‬C++‫دیگر‬ ‫زبانهای‬ ‫نویسان‬ ‫برنامه‬ ‫حقوق‬ ‫از‬ ‫است‬ ‫بیشتر‬( .‫باشد‬ ‫می‬ ‫نویسان‬ ‫برنامه‬ ‫بین‬ ‫صرفا‬ ‫مقایسه‬)
  • 4. ‫ب‬ ‫را‬ ‫جدید‬ ‫قابلیتهای‬ ‫برخی‬ ‫و‬ ‫اید‬ ‫آموخته‬ ‫جاوا‬ ‫در‬ ‫که‬ ‫را‬ ‫زیر‬ ‫موارد‬ ‫شما‬ ‫جلسه‬ ‫این‬ ‫در‬‫ه‬ ‫زبان‬C++‫بینید‬ ‫می‬ ‫نیز‬: •‫بر‬ ‫مروری‬‫گر‬ ‫اشاره‬‫پویا‬ ‫حافظه‬ ‫تخصیص‬ ‫و‬ ‫ها‬ •‫کالسها‬ ‫نوشتن‬‫آن‬ ‫توابع‬ ‫و‬ ‫متغیرها‬ ‫تعریف‬ ‫و‬ •‫صورت‬ ‫به‬ ‫ها‬ ‫داده‬ ‫تعریف‬Public‫و‬Private‫و‬Protected‫دسترسی‬ ‫سطح‬ ‫و‬ ‫هرکدام‬ •‫فراخوانی‬ ‫و‬ ‫نوشتن‬‫سازنده‬‫و‬ ‫ها‬‫مخرب‬‫پوینتر‬ ‫با‬ ‫کردن‬ ‫کار‬ ‫و‬ ‫ها‬this •‫با‬ ‫کردن‬ ‫کار‬ ‫و‬ ‫ساختن‬ ‫نحوه‬‫کالس‬ ‫از‬ ‫متغیری‬‫ایم‬ ‫کرده‬ ‫تعریف‬ ‫که‬ ‫ی‬. •‫ارثبری‬‫یکدیگر‬ ‫از‬ ‫کالسها‬(‫چندگانه‬ ‫و‬ ‫یگانه‬) •‫مورفیسم‬ ‫پلی‬‫توابع‬ ‫و‬‫مجازی‬ •‫استاتیک‬‫و‬‫نمونه‬ •‫مفهوم‬‫دوستی‬(‫کالسها‬ ‫و‬ ‫توابع‬)
  • 5. •‫گرها‬ ‫اشاره‬(‫ادامه‬) •‫با‬ ‫کار‬‫فایل‬‫ها‬ •‫تعریف‬ ‫فضاهای‬Namespace •‫ماکروها‬Preprocessor Directives •‫داده‬ ‫دیگر‬ ‫انواع‬ •‫سربارگذاری‬‫اپراتورها‬(Operator Overloading) •‫ها‬ ‫قالب‬Templates
  • 6. ‫گر‬ ‫اشاره‬ ‫بر‬ ‫مروری‬ ‫متغیر‬ ‫گر‬ ‫اشاره‬ ،‫اید‬ ‫آموخته‬ ‫نویسی‬ ‫برنامه‬ ‫و‬ ‫کامپیوتر‬ ‫مبانی‬ ‫درس‬ ‫در‬ ‫که‬ ‫همانطور‬‫ی‬ ‫میکند‬ ‫اشاره‬ ‫حافظه‬ ‫از‬ ‫ای‬ ‫خانه‬ ‫به‬ ‫که‬ ‫است‬.‫اپراتور‬ ‫دو‬ ‫با‬ ‫مبانی‬ ‫در‬‘&’‫و‬‘*’،‫شدید‬ ‫آشنا‬ ‫از‬ ‫خانه‬ ‫آن‬ ‫در‬ ‫موجود‬ ‫مقدار‬ ‫دیگری‬ ‫و‬ ‫دهد‬ ‫می‬ ‫ما‬ ‫به‬ ‫را‬ ‫حافظه‬ ‫در‬ ‫متغیر‬ ‫آدرس‬ ‫اولی‬ ‫که‬ ‫دهد‬ ‫می‬ ‫ما‬ ‫به‬ ‫را‬ ‫میکند‬ ‫اشاره‬ ‫آن‬ ‫به‬ ‫گر‬ ‫اشاره‬ ‫که‬ ،‫حافظه‬. ‫میکنیم‬ ‫مرور‬ ‫هم‬ ‫با‬ ‫را‬ ‫زیر‬ ‫نکات‬ ‫یادآوری‬ ‫برای‬: •‫متغیر‬ ‫اگر‬A‫جنس‬ ‫از‬*Data،‫باشد‬&A‫جنس‬ ‫از‬ ‫متغیری‬Data**‫و‬*A‫از‬ ‫متغیری‬ ‫جنس‬Data‫بود‬ ‫خواهد‬. •‫جنس‬ ‫از‬ ‫آن‬ ‫عناصر‬ ‫که‬ ‫ای‬ ‫آرایه‬Data‫جنس‬ ‫از‬ ‫ثابتی‬ ‫گر‬ ‫اشاره‬ ‫خود‬ ،‫میباشند‬Data* ‫میباشد‬. •‫کنید‬ ‫فرض‬A‫جنس‬ ‫از‬ ‫متغیری‬Data‫داریم‬ ‫قصد‬ ‫و‬ ‫میباشد‬B‫کنیم‬ ‫تعریف‬ ‫گری‬ ‫اشاره‬ ‫را‬ ‫متغیر‬ ‫به‬ ‫که‬A‫میکند‬ ‫اشاره‬: Data* B = &A; ‫متغیر‬ ‫آدرس‬ ‫فوق‬ ‫دستور‬ ‫در‬A‫در‬B‫میشود‬ ‫ریخته‬.‫از‬ ‫استفاده‬ ‫با‬ ،‫کد‬ ‫دیگر‬ ‫قسمتهای‬ ‫در‬ ‫عملگر‬*‫مقدار‬ ‫به‬ ‫میتوان‬A‫کرد‬ ‫پیدا‬ ‫دسترسی‬.
  • 7. ‫پویا‬ ‫حافظه‬ ‫تخصیص‬ ‫زبان‬ ‫در‬ ‫میدانید‬ ‫که‬ ‫همانطور‬C++‫جای‬ ‫به‬ ‫میتوان‬ ‫ها‬ ‫آرایه‬ ‫مانند‬ ‫حجیم‬ ‫های‬ ‫داده‬ ‫برای‬ Stack‫روی‬ ‫بر‬Heap‫گرفت‬ ‫فضا‬.‫دستور‬ ‫توسط‬ ‫کار‬ ‫این‬new‫میشود‬ ‫انجام‬.‫زیر‬ ‫کد‬ ‫در‬ ‫کنید‬ ‫مشاهده‬ ‫را‬ ‫مورد‬ ‫این‬ ‫از‬ ‫مثال‬ ‫یک‬ ‫میتوانید‬: int a[20]; //Memory allocated on Stack int* a = new int[20]; //Memory allocated on Heap ‫روی‬ ‫بر‬ ‫ها‬ ‫آرایه‬ ‫تعریف‬ ‫مزایای‬ ‫از‬ ‫یکی‬Heap‫تعریف‬ ‫متغیر‬ ‫را‬ ‫آن‬ ‫طول‬ ‫میتوان‬ ‫که‬ ‫است‬ ‫این‬ ‫کرد‬.‫روی‬ ‫بر‬ ‫شده‬ ‫تعریف‬ ‫آرایه‬ ‫اما‬Stack‫مقدار‬ ‫یک‬ ‫همواره‬const‫خود‬ ‫طول‬ ‫عنوان‬ ‫به‬ ‫را‬ ‫پذیرد‬ ‫می‬.‫روی‬ ‫بر‬ ‫متغیر‬ ‫طول‬ ‫با‬ ‫زیر‬ ‫آرایه‬ ‫مثال‬Heap‫است‬ ‫شده‬ ‫تعریف‬: int n; cin >> n; int* a = new int[n]; ‫عملگر‬ ‫واسطه‬ ‫به‬ ‫میتوان‬ ‫را‬ ‫شده‬ ‫داده‬ ‫تخصیص‬ ‫حافظه‬delete[]‫ساخت‬ ‫آزاد‬. ‫ش‬ ‫پاک‬ ‫حافظه‬ ‫یا‬ ‫و‬ ‫شود‬ ‫آزاد‬ ‫پوینتر‬ ‫یک‬ ‫برای‬ ‫داده‬ ‫اختصاص‬ ‫حافظه‬ ‫برنامه‬ ‫طول‬ ‫در‬ ‫اگر‬،‫ود‬ ‫معلق‬ ‫گر‬ ‫اشاره‬ ،‫پوینتر‬ ‫آن‬ ‫به‬(Dangling Pointer)‫میگویند‬.
  • 8. ‫روی‬ ‫بر‬ ‫را‬ ‫ها‬ ‫داده‬ ‫مواقعی‬ ‫چه‬ ‫است‬ ‫این‬ ‫مهم‬ ‫سوال‬ ‫اما‬Stack‫بر‬ ‫مواقعی‬ ‫چه‬ ‫و‬ ‫روی‬Heap‫کنیم؟‬ ‫ذخیره‬ ‫شویم‬ ‫آشنا‬ ‫دو‬ ‫این‬ ‫های‬ ‫ویژگی‬ ‫با‬ ‫کمی‬ ‫است‬ ‫بهتر‬ ‫سوال‬ ‫این‬ ‫پاسخ‬ ‫عنوان‬ ‫به‬: •Stack‫محدود‬ ‫بسیار‬ ‫ای‬ ‫حافظه‬(‫کیلوبایت‬ ‫هزار‬ ‫چند‬ ‫حد‬ ‫در‬)‫باشد‬ ‫می‬.‫در‬ ‫شدن‬ ‫پر‬ ‫صورت‬Stack‫با‬ ‫شما‬ ‫برنامه‬Stack-Overflow‫و‬ ‫شد‬ ‫خواهد‬ ‫مواجه‬ ‫شود‬ ‫می‬ ‫منهدم‬ ‫شما‬ ‫برنامه‬. •‫ساختار‬ ‫دلیل‬ ‫به‬LIFO‫روی‬ ‫بر‬ ‫حافظه‬ ‫تخصیص‬ ،Stack‫از‬ ‫سریعتر‬ ‫بسیار‬ ‫روی‬ ‫بر‬ ‫حافظه‬ ‫تخصیص‬Heap‫باشد‬ ‫می‬. •‫روی‬ ‫بر‬ ‫یافته‬ ‫تخصیص‬ ‫حافظه‬Stack‫خار‬ ‫تعریف‬ ‫بلوک‬ ‫از‬ ‫یا‬ ‫تابع‬ ‫از‬ ‫اینکه‬ ‫از‬ ‫پس‬ ،‫ج‬ ‫آزاد‬ ‫خودکار‬ ‫طور‬ ‫به‬ ،‫شدیم‬(‫مجدد‬ ‫استفاده‬ ‫قابل‬ ‫و‬)‫شد‬ ‫خواهد‬.‫صورت‬ ‫در‬ ‫اما‬ ‫نرو‬ ‫بین‬ ‫از‬ ‫تا‬ ‫کنیم‬ ‫ذخیره‬ ‫و‬ ‫کپی‬ ‫را‬ ‫آنها‬ ‫است‬ ‫بهتر‬ ،‫ها‬ ‫داده‬ ‫آن‬ ‫به‬ ‫مجدد‬ ‫نیاز‬‫ند‬. ‫بندی‬ ‫جمع‬:‫داده‬ ‫باالی‬ ‫حجم‬ ‫پیوسته‬ ‫پردازش‬ ‫به‬ ‫نیاز‬ ‫که‬ ‫مواقعی‬ ‫در‬ ‫تنها‬ ‫پس‬ ‫را‬ ‫ها‬ ‫داده‬ ‫است‬ ‫بهتر‬ ،‫داریم‬‫بر‬‫روی‬Heap‫که‬ ‫باشد‬ ‫حواسمان‬ ‫حتما‬ ‫و‬ ‫کنیم‬ ‫ذخیره‬ ‫جلوگی‬ ‫حافظه‬ ‫بیهوده‬ ‫مصرف‬ ‫از‬ ‫تا‬ ‫کنیم‬ ‫آزاد‬ ‫کار‬ ‫اتمام‬ ‫از‬ ‫پس‬ ‫باید‬ ‫را‬ ‫فضا‬ ‫این‬‫ری‬ ‫شود‬.
  • 9. ‫سوال‬:‫چیست؟‬ ‫شده‬ ‫داده‬ ‫ورودی‬ ‫ازای‬ ‫به‬ ‫زیر‬ ‫کد‬ ‫خروجی‬ ‫ورودی‬: 4 3512 ‫کد‬: int main() { int n; cin >> n; int* a = new int[n]; for (int i = 0; i < n; i++) cin >> a[i]; int* b = a + n; while (b-- != a) cout << *b << "t"; }
  • 10. ‫کالسها‬ ‫نوشتن‬ ‫زبان‬ ‫دو‬ ‫در‬ ‫کالسها‬ ‫نوشتن‬C++‫و‬Java‫ک‬ ‫تفاوتی‬ ‫تنها‬ ‫ندارد‬ ‫چندانی‬ ‫تفاوت‬ ‫بوده‬ ‫یکسان‬ ‫تقریبا‬‫ه‬ ‫همیشه‬‫وجود‬ ‫است‬ ‫بارز‬‘;’‫در‬ ‫کالس‬ ‫بالک‬ ‫انتهای‬ ‫در‬C++‫میباشد‬. ‫کنید‬ ‫توجه‬ ‫زیر‬ ‫مثال‬ ‫به‬: class Rectangle { int width, height; int getArea() { return width*height; } };
  • 11. ‫کالسها‬ ‫توابع‬ ‫نوشتن‬ ‫زبان‬C++‫ب‬ ‫در‬ ‫را‬ ‫کالس‬ ‫توابع‬ ‫امضای‬ ‫تنها‬ ‫که‬ ‫میدهد‬ ‫نویس‬ ‫برنامه‬ ‫به‬ ‫را‬ ‫امکان‬ ‫این‬ ،‫کد‬ ‫خوانایی‬ ‫افزایش‬ ‫برای‬‫دنه‬ ‫کند‬ ‫سازی‬ ‫پیاده‬ ‫کالس‬ ‫همان‬.‫و‬ ‫بنویسد‬ ‫کالس‬ ‫خارج‬ ‫در‬ ‫را‬ ‫تابع‬ ‫بدنه‬ ‫میتواند‬ ‫نویس‬ ‫برنامه‬ ‫دیگر‬ ‫بیان‬ ‫به‬‫امضای‬ ‫تنها‬ ‫بیاورد‬ ‫کالس‬ ‫در‬ ‫را‬ ‫تابع‬ ‫آن‬.‫عملگر‬ ‫از‬ ‫تابع‬ ‫دهی‬ ‫آدرس‬ ‫برای‬ ‫که‬ ‫کنید‬ ‫دقت‬::‫کنیم‬ ‫می‬ ‫استفاده‬. ‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫قطعه‬ ‫به‬ ‫مثال‬ ‫عنوان‬ ‫به‬: class Rectangle { int width, height; void set_values(int, int); }; void Rectangle::set_values(int x, int y) { width = x; height = y; }
  • 12. ‫ها‬ ‫دسترسی‬ ‫سطح‬ ‫میتوانند‬ ‫کالس‬ ‫در‬ ‫شده‬ ‫تعریف‬ ‫های‬ ‫داده‬ ‫از‬ ‫هرکدام‬Private‫یا‬Public‫یا‬ Protected‫باشند‬. ‫اعضای‬Private:‫هستند‬ ‫دسترسی‬ ‫قابل‬ ‫خودشان‬ ‫کالس‬ ‫داخل‬ ‫از‬ ‫فقط‬. ‫اعضای‬Public:‫است‬ ‫دسترسی‬ ‫قابل‬ ،‫باشد‬ ‫دسترسی‬ ‫قابل‬ ‫شی‬ ‫که‬ ‫جا‬ ‫هر‬ ‫در‬. ‫اعضای‬Protected:‫قابل‬ ‫دوستانشان‬ ‫و‬ ‫فرزندانشان‬ ،‫خودشان‬ ‫کالس‬ ‫داخل‬ ‫در‬ ‫هستند‬ ‫دسترسی‬. ‫ت‬ ‫هنگام‬ ‫تابعی‬ ‫یا‬ ‫متغیر‬ ‫دسترسی‬ ‫سطح‬ ‫اگر‬‫ع‬‫سطح‬ ،‫نشود‬ ‫مشخص‬ ‫ریف‬ ‫دسترسی‬Private‫شود‬ ‫می‬ ‫گرفته‬ ‫نظر‬ ‫در‬ ‫فرض‬ ‫پیش‬ ‫طور‬ ‫به‬ ‫آن‬ ‫برای‬. ‫میان‬ ‫دیگر‬ ‫تفاوتی‬ ‫میتوانید‬ ‫بعد‬ ‫صفحه‬ ‫در‬syntax‫شده‬ ‫آورده‬ ‫کد‬ ‫در‬ ‫را‬ ‫زبان‬ ‫دو‬ ‫این‬ ‫ببینید‬:
  • 13. ‫مثال‬: class Rectangle { int width, height; public: int area() { return width*height; } int getHeight() { return height; } }; ‫توابع‬ ‫فوق‬ ‫مثال‬ ‫در‬area()‫و‬getHeight()‫دسترسی‬ ‫سطح‬ ‫دارای‬public‫میباشند‬ ‫متغیرهای‬ ‫و‬width‫و‬height‫دسترسی‬ ‫سطح‬ ‫دارای‬private‫میباشند‬. ‫تذکر‬:‫توسط‬ ‫خصوصی‬ ‫عضو‬ ‫یک‬ ‫گر‬ ‫اشاره‬ ‫یا‬ ‫ارجاع‬ ‫بازگرداندن‬ ‫که‬ ‫کنید‬ ‫دقت‬‫تابعی‬ ‫رفتن‬ ‫بین‬ ‫از‬ ‫باعث‬ ،‫عمومی‬Encapsulation‫میشود‬ ‫کالس‬.
  • 14. ‫ها‬ ‫سازنده‬ ‫زبان‬ ‫در‬C++‫مانند‬ ‫نیز‬Java‫است‬ ‫سازنده‬ ‫عدد‬ ‫یک‬ ‫حداقل‬ ‫دارای‬ ‫کالس‬ ‫هر‬.‫سازنده‬ ‫به‬ ‫زبان‬ ‫در‬ ‫آرگومان‬ ‫بدون‬C++،default constructor‫گویند‬ ‫می‬.‫به‬‫فراخوانی‬ ‫و‬ ‫نوشته‬ ‫نحوه‬ ‫کنید‬ ‫توجه‬ ‫کدها‬ ‫این‬ ‫در‬ ‫ها‬ ‫سازنده‬ ‫شدن‬: #include <iostream> using namespace std; class Circle { double radius; public: Circle(double r) { radius = r; } double circum() { return 2 * radius*3.14159265; } };
  • 15. int main() { Circle foo(10.0); // functional form Circle bar = 20.0; // assignment init. Circle baz{ 30.0 }; // uniform init. Circle qux = { 40.0 }; // POD-like cout << "foo's circumference: " << foo.circum() << 'n'; //prints: foo's circumference: 62.8319 return 0; }
  • 16. ‫مثال‬: #include <bits/stdc++.h> //or #include <iostream> if in VS using namespace std; class Query { public: int L, R; }; void printQuerySums(int a[], int n, Query q[], int m) { for (int i = 0; i < m; i++) { int L = q[i].L, R = q[i].R, sum = 0; for (int j = L; j <= R; j++) sum += a[j]; cout << "Sum of [" << L << ", " << R << "] is " << sum << endl; } }
  • 17. int main() { int a[] = { 1, 1, 2, 1, 3, 4, 5, 2, 8 }; int n = sizeof(a) / sizeof(a[0]); Query q[] = { { 0, 4 }, { 1, 3 }, { 2, 4 } }; int m = sizeof(q) / sizeof(q[0]); printQuerySums(a, n, q, m); return 0; } ‫دارد‬ ‫وجود‬ ‫توجه‬ ‫قابل‬ ‫نکته‬ ‫سه‬ ‫فوق‬ ‫مثال‬ ‫در‬: •‫کالس‬ ‫عمومی‬ ‫پارامترهای‬ ‫اولیه‬ ‫مقداردهی‬ ‫روش‬ ‫یک‬:‫برای‬ ‫فقط‬ ‫روش‬ ‫این‬ ‫که‬ ‫کنید‬ ‫دقت‬ ‫که‬ ‫کالسهایی‬‫دارند‬ ‫عمومی‬ ‫پارامتر‬ ‫فقط‬‫است‬ ‫استفاده‬ ‫قابل‬.‫تعداد‬ ‫که‬ ‫کنید‬ ‫دقت‬ ‫همچنین‬ ‫باشد‬ ‫بیشتر‬ ‫کالس‬ ‫متغیرهای‬ ‫تعداد‬ ‫از‬ ‫نباید‬ ‫شده‬ ‫مقداردهی‬ ‫پارامترهای‬. •‫تابع‬ ‫عملکرد‬ ‫نحوه‬sizeof‫کالس‬ ‫از‬ ‫شده‬ ‫ایجاد‬ ‫اشیای‬ ‫برای‬ •‫تابع‬ ‫یک‬ ‫به‬ ،‫کالس‬ ‫از‬ ‫شده‬ ‫ایجاد‬ ‫اشیای‬ ‫از‬ ‫ای‬ ‫آرایه‬ ‫ارسال‬
  • 18. ‫مثال‬: class Rectangle { int width, height; public: Rectangle(); Rectangle(int, int); int area(void) { return (width*height); } }; Rectangle::Rectangle() { width = 5; height = 5; {
  • 19. Rectangle::Rectangle(int a, int b) { width = a; height = b; } int main() { Rectangle rect(3, 4); Rectangle rectb; //calling default constructor cout << "rect area: " << rect.area() << endl;//prints: rect area: 12 cout << "rectb area: "<< rectb.area() << endl;//prints: rectb area: 25 return 0; }
  • 20. ‫فراخوانی‬ ‫هنگام‬default constructor‫کنید‬ ‫توجه‬ ‫زیر‬ ‫نکات‬ ‫به‬ ‫حتما‬: Rectangle rectb; // default constructor called Rectangle rectc(); // function declaration (default constructor NOT called) Rectangle rectd{}; // default constructor called ‫سه‬ ‫هر‬ ‫با‬ ‫میتواند‬ ‫سازنده‬ ‫یک‬syntax‫دهد‬ ‫انجام‬ ‫را‬ ‫عناصر‬ ‫اولیه‬ ‫دهی‬ ‫مقدار‬ ‫زیر‬: (‫میباشند‬ ‫یکدیگر‬ ‫معادل‬ ‫زیر‬ ‫دستورات‬) Rectangle::Rectangle(int x, int y) { width = x; height = y; } Rectangle::Rectangle(int x, int y) : width(x) { height = y; } Rectangle::Rectangle(int x, int y) : width(x), height(y) { }
  • 21. this ‫نام‬ ‫به‬ ‫گری‬ ‫اشاره‬ ‫طریق‬ ‫از‬ ‫میتواند‬ ‫شیء‬ ‫هر‬this‫دسترسی‬ ‫خودش‬ ‫آدرس‬ ‫به‬ ‫کند‬ ‫پیدا‬.this‫قواعد‬ ‫از‬ ‫بنابراین‬ ‫و‬ ‫میباشد‬ ‫کالس‬ ‫به‬ ‫پوینتر‬ ‫جنس‬ ‫دارای‬syntax ‫میکند‬ ‫پیروی‬ ‫پوینترها‬.‫یک‬ ‫با‬ ‫که‬ ‫نیست‬ ‫بد‬ ‫شروع‬ ‫برای‬operator‫آشنا‬ ‫جدید‬ ‫شویم‬: ‫اپراتور‬->‫هستند‬ ‫معادل‬ ‫زیر‬ ‫دستور‬ ‫دو‬ ‫که‬ ‫میکند‬ ‫عمل‬ ‫ای‬ ‫گونه‬ ‫به‬: (*ap).grade = 20; ap->grade = 20; ‫را‬ ‫پوینتر‬ ‫ابتدا‬ ‫واقع‬ ‫در‬ ‫عملگر‬ ‫این‬ ‫میکنید‬ ‫مشاهده‬ ‫که‬ ‫همانطور‬dereference‫میکند‬ ‫میکند‬ ‫پیدا‬ ‫دسترسی‬ ‫شیء‬ ‫آن‬ ‫آرگومانهای‬ ‫به‬ ‫سپس‬. ‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
  • 22. #include <iostream> using namespace std; class Box { public: Box(double l = 2.0, double b = 2.0, double h = 2.0) // Constructor definition { cout << "Constructor called." << endl; length = l; breadth = b; height = h; }
  • 23. double Volume() { return length * breadth * height; } int compare(Box box) { return this->Volume() > box.Volume(); // returns 1 if the statement is true, otherwise 0 would be returned } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box };
  • 24. int main(void) { Box Box1(3.3, 1.2, 1.5); // Declare box1 Box Box2(8.5, 6.0, 2.0); // Declare box2 if (Box1.compare(Box2)) { cout << "Box2 is smaller than Box1" << endl; }
  • 25. else { cout << "Box2 is equal to or larger than Box1" << endl; } return 0; } ‫خروجی‬‫باشد‬ ‫می‬ ‫زیر‬ ‫شکل‬ ‫به‬ ‫کد‬ ‫این‬: Constructor called. Constructor called. Box2 is equal to or larger than Box1 ‫تذکر‬:‫از‬ ‫استفاده‬this‫میشود‬ ‫محسوب‬ ‫خطا‬ ‫ایستا‬ ‫توابع‬ ‫در‬.
  • 26. ‫گر‬ ‫اشاره‬ ‫که‬ ‫صورت‬ ‫بدین‬ ‫دارد‬ ‫وجود‬ ‫توجهی‬ ‫قابل‬ ‫نکته‬ ‫اما‬this‫زبان‬ ‫در‬ ‫نمیتواند‬C++‫سازنده‬ ‫از‬ ‫ای‬ ‫زنجیره‬ ‫تشکیل‬ ‫بدهد‬ ‫را‬ ‫ها‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬ ‫مثال‬ ‫عنوان‬ ‫به‬: class A { public: A() { A(0); } A(int a) { cout << "did"; } }; ‫جای‬ ‫به‬ ‫ششم‬ ‫خط‬ ‫در‬ ‫اگر‬ ‫فوق‬ ‫کد‬ ‫در‬A(0);‫دستور‬this(0);‫میشدیم‬ ‫رو‬ ‫به‬ ‫رو‬ ‫کامپایلر‬ ‫خطای‬ ‫با‬ ‫مینوشتیم‬ ‫را‬. (VS 2013 & g++)
  • 27. ‫دیگر‬ ‫مثالی‬: class CDummy { public: int isItMe(CDummy& param); }; int CDummy::isItMe(CDummy& param) { if (&param == this) return true; else return false; }
  • 28. int main() { CDummy a; CDummy* b = &a; if (b->isItMe(a)) cout << "yes, &a is b" << endl; else cout << "no, they are differentn"; }
  • 29. ‫مخرب‬ ‫توابع‬(Destructor) Destructor‫دارند‬ ‫ها‬ ‫سازنده‬ ‫مخالف‬ ‫ای‬ ‫وظیفه‬ ‫ها‬. Destructor‫که‬ ‫میشوند‬ ‫اجرا‬ ‫زمانی‬object‫ای‬‫تخریب‬ ،‫است‬ ‫گردیده‬ ‫ایجاد‬ ‫که‬ ‫گردد‬. ‫یک‬ ‫زندگی‬ ‫طول‬ ‫که‬ ‫افتد‬ ‫اتفاق‬ ‫میتواند‬ ‫زمانی‬ ‫تخریب‬object‫رسیده‬ ‫پایان‬ ‫به‬ ‫باشد‬. Destructor‫همانند‬ ‫نیز‬ ‫ها‬Constructor‫با‬ ‫همنام‬ ‫ها‬class‫و‬ ‫هستند‬ ‫نظر‬ ‫مورد‬ ‫عالمت‬ ‫یک‬ ‫تنها‬~‫دارد‬ ‫قرار‬ ‫آنها‬ ‫نام‬ ‫ابتدای‬ ‫در‬. Destructor‫همانند‬ ‫نیز‬ ‫ها‬Constructor‫داشت‬ ‫نخواهند‬ ‫بازگشتی‬ ‫مقدار‬ ‫ها‬. ‫اگر‬Destructor‫می‬ ‫ایجاد‬ ‫اتوماتیک‬ ‫صورت‬ ‫به‬ ‫نگردد‬ ‫تعریف‬ ‫صریح‬ ‫صورت‬ ‫به‬‫شود‬. Destructor‫مناسبند‬ ‫هستند‬ ‫پویا‬ ‫حافظه‬ ‫دارای‬ ‫که‬ ‫اشیایی‬ ‫برای‬ ‫ها‬.
  • 30.
  • 31. ‫آنها‬ ‫با‬ ‫کار‬ ‫نحوه‬ ‫و‬ ‫کالس‬ ‫از‬ ‫متغیر‬ ‫ساخت‬ ‫انواع‬ ‫زبان‬ ‫در‬ ‫متغیرها‬C++‫میشوند‬ ‫مقداردهی‬ ‫و‬ ‫تعریف‬ ‫گونه‬ ‫دو‬ ‫به‬: •‫کالس‬ ‫جنس‬ ‫از‬ ‫متغیر‬ •‫کالس‬ ‫به‬ ‫گر‬ ‫اشاره‬ ‫جنس‬ ‫از‬ ‫متغیر‬ ‫اش‬ ‫را‬ ‫حافظه‬ ‫آن‬ ‫روی‬ ‫بر‬ ‫داریم‬ ‫تصمیم‬ ‫که‬ ‫است‬ ‫مکانی‬ ‫بنابر‬ ‫عمدتا‬ ‫نوع‬ ‫دو‬ ‫این‬ ‫تفاوت‬‫غال‬ ‫کنیم‬.‫روی‬ ‫بر‬ ‫فضا‬ ‫اول‬ ‫نوع‬ ‫در‬Stack‫دوم‬ ‫نوع‬ ‫در‬ ‫که‬ ‫حالی‬ ‫در‬ ،‫میشود‬ ‫گرفته‬(‫علت‬ ‫به‬ new‫کردن‬)‫روی‬ ‫بر‬ ‫فضا‬Heap‫میشود‬ ‫گرفته‬. ‫نوع‬ ‫متغیرهای‬ ،‫بودند‬ ‫اول‬ ‫نوع‬ ‫از‬ ‫متغیرها‬ ‫همگی‬ ‫دیدید‬ ‫که‬ ‫مثالهایی‬ ‫تمامی‬ ‫تاکنون‬‫دوم‬ ‫عملگر‬ ‫واسطه‬ ‫به‬ ،‫بودن‬ ‫پوینتری‬ ‫علت‬ ‫به‬->‫میکنند‬ ‫پیدا‬ ‫دسترسی‬ ‫خود‬ ‫آرگومانهای‬ ‫به‬. ‫نکته‬:‫زبان‬ ‫که‬ ‫آنجا‬ ‫از‬C++‫فاقد‬Garbage Collector‫به‬ ‫که‬ ‫متغیرهایی‬ ‫تمامی‬ ،‫میباشد‬ ‫دستور‬ ‫واسطه‬new‫دستو‬ ‫توسط‬ ‫دستی‬ ‫طور‬ ‫به‬ ‫باید‬ ،‫میشود‬ ‫گرفته‬ ‫حافظه‬ ‫آنها‬ ‫برای‬‫ر‬ delete‫و‬ ‫کرد‬ ‫خواهد‬ ‫اشغال‬ ‫زیادی‬ ‫حافظه‬ ‫برنامه‬ ‫صورت‬ ‫این‬ ‫غیر‬ ‫در‬ ‫شوند‬ ‫پاک‬ ‫نهایت‬ ‫در‬ ‫بزند‬ ‫فایلها‬ ‫دیگر‬ ‫به‬ ‫آسیبی‬ ‫است‬ ‫ممکن‬ ‫موارد‬ ‫بعضی‬ ‫در‬ ‫حتی‬.‫ت‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬‫وجه‬ ‫کنید‬:
  • 32. // pointer to classes example #include <iostream> using namespace std; class Rectangle { int width, height; public: Rectangle(int x, int y) : width(x), height(y) {} int area(void) { return width * height; } };
  • 33. int main() { Rectangle obj(3, 4); Rectangle * foo, *bar, *baz; foo = &obj; bar = new Rectangle(5, 6); baz = new Rectangle[2] {{ 2, 5 }, { 3, 6 } }; cout << "obj's area: " << obj.area() << 'n'; cout << "*foo's area: " << foo->area() << 'n'; cout << "*bar's area: " << bar->area() << 'n'; cout << "baz[0]'s area:" << baz[0].area() << 'n'; cout << "baz[1]'s area:" << baz[1].area() << 'n'; delete bar; delete[] baz; return 0; }
  • 34. ‫میباشد‬ ‫شکل‬ ‫بدین‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫خروجی‬: obj's area: 12 *foo's area: 12 *bar's area: 30 baz[0]'s area:10 baz[1]'s area:18 ‫نکته‬:‫دستور‬delete[]‫دستور‬ ‫مانند‬ ‫عملکردی‬ ‫حالت‬ ‫بدترین‬ ‫در‬delete‫ولی‬ ‫دارد‬ ‫کند‬ ‫آزاد‬ ‫میتواند‬ ‫را‬ ‫بیشتری‬ ‫خیلی‬ ‫فضای‬ ‫حالت‬ ‫بهترین‬ ‫در‬.
  • 35. ‫ارثبری‬ ‫دستور‬ ‫از‬ ‫جاوا‬ ‫زبان‬ ‫در‬ ،‫میکند‬ ‫ارثبری‬ ‫دیگری‬ ‫کالس‬ ‫از‬ ‫کالس‬ ‫یک‬ ‫اینکه‬ ‫اعالن‬ ‫برای‬extends‫در‬ ‫اما‬ ،‫میشود‬ ‫استفاده‬ ‫زبان‬C++‫عملگر‬ ‫از‬ ‫آن‬ ‫جای‬ ‫به‬:‫واژه‬ ‫و‬public‫میشود‬ ‫استفاده‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬: #include <iostream> using namespace std; class Polygon { protected: int width, height; public: void set_values(int a, int b) { width = a; height = b; } };
  • 36. class Rectangle : public Polygon { public: int area() { return width * height; } }; class Triangle : public Polygon { public: int area() { return width * height / 2; } };
  • 37. int main() { Rectangle rect; Triangle trgl; rect.set_values(4, 5); trgl.set_values(4, 5); cout << rect.area() << 'n'; cout << trgl.area() << 'n'; return 0; } ‫میباشد‬ ‫صورت‬ ‫بدین‬ ‫فوق‬ ‫کد‬ ‫خروجی‬: 20 10
  • 38. ‫زبان‬ ‫در‬C++،‫شود‬ ‫فراخوانی‬ ‫کالس‬ ‫یک‬ ‫سازنده‬ ‫که‬ ‫صورتی‬ ‫در‬ ‫جاوا‬ ‫همانند‬ ‫نیز‬default constructor‫کالس‬ ‫آن‬ ‫والد‬(super()‫جاوا‬ ‫در‬(‫میشود‬ ‫فراخوانی‬ ‫نیز‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫قطعه‬ ‫به‬: class Mother { public: Mother() { cout << "Mother: no parametersn"; } Mother(int a) { cout << "Mother: int parametern"; } };
  • 39. class Daughter : public Mother { public: Daughter(int a) { cout << "Daughter: int parameternn"; } }; class Son : public Mother { public: Son(int a) : Mother(a) { cout << "Son: int parameternn"; } };
  • 40. int main() { Daughter kelly(0); Son bud(0); return 0; } ‫میباشد‬ ‫زیر‬ ‫شکل‬ ‫به‬ ‫فوق‬ ‫کد‬ ‫خروجی‬: Mother: no parameters Daughter: int parameter Mother: int parameter Son: int parameter
  • 41. ‫میش‬ ‫ایجاد‬ ‫فرزند‬ ‫جنس‬ ‫از‬ ‫جدیدی‬ ‫شی‬ ‫که‬ ‫هنگامی‬ ‫گفت‬ ‫میتوان‬ ‫کلی‬ ‫طور‬ ‫به‬،‫ود‬ ‫اجرای‬ ‫قبل‬Constructor،‫موردنظر‬ ‫کالس‬ ‫به‬ ‫متعلق‬Constructor‫کالس‬ ‫به‬ ‫متعلق‬ ‫گردد‬ ‫می‬ ‫اجرا‬ ‫والد‬. ‫صورت‬ ‫به‬ ‫ها‬ ‫سازنده‬ ‫اجرای‬ ‫نحوه‬ ‫که‬ ‫گفت‬ ‫میتوان‬top down order‫بود‬ ‫خواهد‬. ‫برای‬destructor‫ابتدا‬ ‫ها‬destructor‫سپس‬ ‫و‬ ‫شده‬ ‫اجرا‬ ‫فرزند‬ ‫کالس‬destructor ‫میشود‬ ‫زده‬ ‫صدا‬ ‫مادر‬. ‫صورت‬ ‫به‬ ‫ها‬ ‫مخرب‬ ‫اجرای‬ ‫نحوه‬ ‫که‬ ‫گفت‬ ‫میتوان‬bottom up order‫بود‬ ‫خواهد‬.
  • 42. // pointer is destroyed because it goes out of scope, // but not the object it pointed to. memory leak if (1) { Foo *myfoo = new Foo("foo"); } // pointer is destroyed because it goes out of scope, // object it points to is deleted. no memory leak if (1) { Foo *myfoo = new Foo("foo"); delete myfoo; } // no memory leak, object goes out of scope if (1) { Foo myfoo("foo"); }
  • 43. ‫کنید‬ ‫توجه‬ ‫زیر‬ ‫نکات‬ ‫به‬: •‫بود‬ ‫خواهد‬ ‫مجاز‬ ‫والد‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫به‬ ‫فرزند‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ‫انتساب‬. •‫نم‬ ‫منتسب‬ ‫فرزند‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫به‬ ‫توان‬ ‫نمی‬ ‫را‬ ‫والد‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫یک‬‫ود‬. •‫از‬ ‫استفاده‬ ‫با‬Casting‫کالس‬ ‫گر‬ ‫اشاره‬ ‫به‬ ‫را‬ ‫والد‬ ‫کالس‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ‫میتوان‬ ‫کرد‬ ‫منسوب‬ ‫فرزند‬. •‫باعث‬ ‫میتواند‬ ‫فرزند‬ ‫کالس‬ ‫از‬ ‫شی‬ ‫عنوان‬ ‫به‬ ‫والد‬ ‫کالس‬ ‫از‬ ‫شی‬ ‫یک‬ ‫با‬ ‫رفتار‬‫بروز‬ ‫گردد‬ ‫خطا‬. •‫اگر‬p‫میتوان‬ ‫آنگاه‬ ،‫باشد‬ ‫والد‬ ‫کالس‬ ‫نوع‬ ‫از‬ ‫گری‬ ‫اشاره‬p‫آن‬ ‫از‬ ‫فرزندی‬ ‫هر‬ ‫به‬ ‫را‬ ‫مرتبط‬ ‫تابع‬ ‫نیز‬ ‫فرزند‬ ‫کالس‬ ‫از‬ ‫تابعی‬ ‫فراخوانی‬ ‫صورت‬ ‫در‬ ،‫داد‬ ‫اشاره‬ ‫کالس‬ (‫همنام‬)‫میشود‬ ‫اجرا‬ ‫والد‬ ‫کالس‬ ‫در‬.
  • 44. ‫مجازی‬ ‫توابع‬ ‫و‬ ‫مورفیسم‬ ‫پلی‬ ‫مجازی‬ ‫تابع‬:‫کلیدی‬ ‫کلمه‬ ‫با‬ ‫که‬ ‫است‬ ‫تابعی‬virtual‫شود‬ ‫می‬ ‫مشخص‬. •‫از‬ ‫یکی‬ ‫حداقل‬ ‫در‬ ‫یعنی‬ ،‫شود‬ ‫می‬ ‫تعریف‬ ‫مجازی‬ ‫طور‬ ‫به‬ ‫تابعی‬ ‫وقتی‬ ‫دارد‬ ‫وجود‬ ‫نام‬ ‫همین‬ ‫با‬ ‫تابعی‬ ‫نیز‬ ‫فرزند‬ ‫کالسهای‬. •‫بتوانی‬ ،‫گرها‬ ‫اشاره‬ ‫از‬ ‫استفاده‬ ‫هنگام‬ ‫که‬ ‫میدهند‬ ‫را‬ ‫امکان‬ ‫این‬ ‫مجازی‬ ‫توابع‬‫م‬ ‫یابیم‬ ‫دست‬ ‫جاری‬ ‫شی‬ ‫توابع‬ ‫به‬ ،‫گر‬ ‫اشاره‬ ‫نوع‬ ‫گرفتن‬ ‫نظر‬ ‫در‬ ‫بدون‬. •‫کلیدی‬ ‫کلمه‬ ‫از‬ ‫استفاده‬virtual‫شود‬ ‫می‬ ‫سبب‬ ،‫والد‬ ‫کالس‬ ‫در‬ ‫تابعی‬ ‫برای‬ ‫گردد‬ ‫مجازی‬ ‫نیز‬ ‫فرزند‬ ‫کالسهای‬ ‫در‬ ‫مذکور‬ ‫تابع‬. •‫فر‬ ‫کالسهای‬ ‫تابع‬ ‫برای‬ ،‫بیشتر‬ ‫شدن‬ ‫مشخص‬ ‫برای‬ ‫میدهند‬ ‫ترجیح‬ ‫برخی‬‫زند‬ ‫کنند‬ ‫قید‬ ‫را‬ ‫مجازی‬ ‫کلمه‬ ‫نیز‬. ‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
  • 45. class A { public: virtual void f() { cout << "A::f() executingn"; } }; class B : public A { public: void f() { cout << "B::f() executingn"; } };
  • 46. int main() { A a; B b; A* p = &a; p->f(); p = &b; p->f(); }
  • 47.
  • 48. class Base { public: void NonVirtual() { cout << "Base NonVirtual called.n"; } virtual void Virtual() { cout << "Base Virtual called.n"; } };
  • 49. class Derived : public Base { public: void NonVirtual() { cout << "Derived NonVirtual called.n"; } void Virtual() { cout << "Derived Virtual called.n"; } };
  • 50. int main() { Base* bBase = new Base(); Base* bDerived = new Derived(); bBase->NonVirtual(); bBase->Virtual(); bDerived->NonVirtual(); bDerived->Virtual(); }
  • 51. ‫کالسها‬ ‫تمامی‬ ‫در‬ ‫باید‬ ‫می‬ ‫که‬ ‫باشد‬ ‫داشته‬ ‫وجود‬ ‫مجازی‬ ‫تابع‬ ‫اگر‬override‫را‬ ‫آن‬ ،‫گردد‬ PureVirtual‫نامیم‬ ‫می‬.‫ندارد‬ ‫سازی‬ ‫پیاده‬ ‫به‬ ‫نیاز‬ ‫تابعی‬ ‫چنین‬. class Vertebrate { public: virtual void eat() = 0; //pure virtual function }; class Fish : public Vertebrate { public: void eat(); //implemented specifically for Fish class elsewhere }; ‫تابع‬pure virtual‫تابع‬ ‫را‬Abstract‫نامند‬ ‫می‬ ‫نیز‬.
  • 52. Abstract Class ‫تابع‬ ‫یک‬ ‫کم‬ ‫دست‬ ‫که‬ ‫کالسی‬pure virtual‫دارد‬. Concrete Class ‫کالسی‬‫تابع‬ ‫که‬pure virtual‫ندارد‬. Interface ‫آن‬ ‫توابع‬ ‫تمامی‬ ‫که‬ ‫کالسی‬pure virtual‫باشند‬. ‫نکات‬: •‫کالس‬ ‫یک‬ ‫از‬Abstract‫کرد‬ ‫ایجاد‬ ‫شی‬ ‫توان‬ ‫نمی‬. •‫کالس‬ ‫از‬Abstract‫کرد‬ ‫ارثبری‬ ‫میتوان‬ ‫تنها‬. •‫توابع‬ ‫تمامی‬ ‫فرزند‬ ‫کالس‬abstract‫را‬ ‫آنها‬ ‫که‬ ‫مادامی‬ ‫و‬ ‫برد‬ ‫می‬ ‫ارث‬ ‫به‬ ‫را‬override‫کالس‬ ‫یک‬ ‫نیز‬ ‫خود‬ ‫نکند‬ abstract‫میشود‬ ‫محسوب‬. •‫توابع‬abstract‫کالس‬ ‫در‬‫باید‬ ‫فرزند‬override‫کرد‬ ‫ایجاد‬ ‫آن‬ ‫از‬ ‫شی‬ ‫بتوان‬ ‫تا‬ ‫شوند‬. •‫کالس‬ ‫یک‬abstract‫میکنند‬ ‫ارثبری‬ ‫آن‬ ‫از‬ ‫که‬ ‫است‬ ‫کالسهایی‬ ‫تمامی‬ ‫از‬ ‫مشترکی‬ ‫وجوه‬.
  • 53. class Shape { protected: int posX, posY; public: virtual void draw() = 0; void setPosition(int pX, int pY) { posX = pX; posY = pY; } };
  • 54. class Rectangle : public Shape { public: virtual void draw() { cout << "Drawing rectangle at " << posX << " " << posY << endl; } }; class Hexagon : public Shape { public: virtual void draw() { cout << "Drawing hexagon at " << posX << " " << posY << endl; } };
  • 55. int main() { const int NUM_SHAPES = 3; Shape* shapeArray[] = { new Hexagon(), new Rectangle(), new Hexagon() }; int posX = 5, posY = 15; for (int k = 0; k < NUM_SHAPES; k++) //set positions of all the shapes { shapeArray[k]->setPosition(posX, posY); posX += 10; posY += 10; }; for (int j = 0; j < NUM_SHAPES; j++) //draw all the shapes at their positions shapeArray[j]->draw(); return 0; }
  • 56. ‫نمونه‬ ‫و‬ ‫استاتیک‬ ‫در‬ ‫استاتیک‬ ‫توابع‬ ‫و‬ ‫متغیرها‬C++‫یک‬ ‫فقط‬ ‫و‬ ‫هستند‬ ‫مشابه‬ ‫عملکرد‬ ‫نظر‬ ‫از‬ ‫کامال‬ ‫جاوا‬ ‫و‬ ‫دارند‬ ‫سینتکسی‬ ‫تفاوت‬:‫در‬C++‫عملگر‬ ‫توسط‬ ‫کالس‬ ‫توابع‬ ‫و‬ ‫متغیرها‬ ‫به‬::‫میتوانیم‬ ‫کنیم‬ ‫پیدا‬ ‫دسترسی‬. ‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬: class Dummy { public: static int n; Dummy() { n++; } ~Dummy() { n--; } }; int Dummy::n = 0;
  • 57. int main() { Dummy a; Dummy b[5]; Dummy * c = new Dummy; cout << a.n << endl; delete c; cout << b->n << endl; b->n = 10; cout << b[2].n << endl; return 0; }
  • 58. ‫چندگانه‬ ‫ارثبری‬ ‫زبان‬C++‫عنو‬ ‫به‬ ‫یعنی‬ ،‫کند‬ ‫می‬ ‫پشتیبانی‬ ‫را‬ ‫چندگانه‬ ‫ارثبری‬ ،‫جاوا‬ ‫برخالف‬‫ان‬ ‫خ‬ ‫با‬ ‫برنامه‬ ‫اینکه‬ ‫بدون‬ ‫کند‬ ‫ارثبری‬ ‫کالس‬ ‫چند‬ ‫از‬ ‫تواند‬ ‫می‬ ‫کالس‬ ‫یک‬ ‫مثال‬‫طایی‬ ‫شود‬ ‫مواجه‬.‫به‬‫شکل‬‫کنید‬ ‫توجه‬ ‫زیر‬:
  • 59. class Polygon { protected: int width, height; public: Polygon(int a, int b) : width(a), height(b) {} };
  • 60. class Output { public: static void print(int i); }; void Output::print(int i) { cout << i << 'n'; }
  • 61. class Rectangle : public Polygon, public Output { public: Rectangle(int a, int b) : Polygon(a, b) {} int area() { return width*height; } };
  • 62. class Triangle : public Polygon, public Output { public: Triangle(int a, int b) : Polygon(a, b) {} int area() { return width*height / 2; } };
  • 63. int main() { Rectangle rect(4, 5); Triangle trgl(4, 5); rect.print(rect.area()); Triangle::print(trgl.area()); return 0; } ‫است‬ ‫شکل‬ ‫بدین‬ ‫فوق‬ ‫برنامه‬ ‫خروجی‬: 20 10
  • 64. ‫سوال‬ ‫یک‬ ‫اما‬!!‫کند؟‬ ‫نمی‬ ‫پشتیبانی‬ ‫را‬ ‫چندگانه‬ ‫ارثبری‬ ‫جاوا‬ ‫چرا‬ ‫کالس‬ ‫کنید‬ ‫فرض‬C‫نامهای‬ ‫به‬ ‫والد‬ ‫کالس‬ ‫دو‬ ‫دارای‬A‫و‬B‫کنید‬ ‫فرض‬ ‫و‬ ‫باشد‬ ‫کالس‬C‫نام‬ ‫به‬ ‫تابعی‬ ‫از‬ ‫بخواهد‬print()‫سازی‬ ‫پیاده‬ ‫توابع‬ ‫این‬ ‫هردوی‬ ‫در‬ ‫که‬ ‫کند‬ ‫استفاده‬ ‫شده‬.‫میشود؟‬ ‫زده‬ ‫صدا‬ ‫تابع‬ ‫کدام‬!‫خ‬ ‫کننده‬ ‫گیج‬ ‫برنامه‬ ،‫بله‬‫واهد‬ ‫کند‬ ‫نمی‬ ‫پشتیبانی‬ ‫را‬ ‫چندگانه‬ ‫ارثبری‬ ‫جاوا‬ ‫زبان‬ ‫بنابراین‬ ‫و‬ ‫شد‬.‫ک‬ ‫حال‬ ‫اما‬‫زبان‬ ‫ه‬ C++‫نتیج‬ ‫رخدادی‬ ‫چنین‬ ‫وجود‬ ‫صورت‬ ‫در‬ ،‫کند‬ ‫می‬ ‫پشتیبانی‬ ‫را‬ ‫قابلیت‬ ‫این‬‫چه‬ ‫ه‬ ‫شد؟‬ ‫خواهد‬ ‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬ ‫لطفا‬ ‫فوق‬ ‫سوال‬ ‫جواب‬ ‫یافتن‬ ‫برای‬:
  • 65.
  • 66. ‫دوستی‬ ‫مفهوم‬ ‫در‬C++‫نام‬ ‫به‬ ‫دارد‬ ‫وجود‬ ‫ارثبری‬ ‫بر‬ ‫عالوه‬ ‫ارتباط‬ ‫از‬ ‫دیگری‬ ‫نوع‬«‫دوستی‬». ‫میت‬ ،‫باشند‬ ‫شده‬ ‫تعریف‬ ‫دیگری‬ ‫کالس‬ ‫یک‬ ‫دوست‬ ‫عنوان‬ ‫به‬ ‫تابعی‬ ‫یا‬ ‫کالس‬ ‫اگر‬‫به‬ ‫وانند‬ ‫متغیرهای‬protected‫و‬private‫کنند‬ ‫پیدا‬ ‫دسترسی‬ ‫کالس‬ ‫آن‬. ‫است‬ ‫برقرار‬ ‫زیر‬ ‫قواعد‬ ‫دوستی‬ ‫در‬: •‫کالس‬ ‫اگر‬A‫کالس‬ ‫دوست‬ ‫عنوان‬ ‫به‬B‫کالس‬ ،‫باشد‬B‫کالس‬ ‫دوست‬A‫نیست‬ (‫ندارد‬ ‫تقارنی‬ ‫خاصیت‬ ‫دوستی‬)‫کالس‬ ‫برای‬ ‫دسترسی‬ ‫سطح‬ ‫این‬ ‫اینکه‬ ‫مگر‬B‫نیز‬ ‫شود‬ ‫تعریف‬. •‫کالس‬ ‫اگر‬A‫کالس‬ ‫دوست‬B‫کالس‬ ‫و‬ ‫باشد‬B‫کالس‬ ‫دوست‬C‫کالس‬ ،‫باشد‬A ‫کالس‬ ‫دوست‬C‫نیست‬( .‫ندارد‬ ‫ترایایی‬ ‫خاصیت‬ ‫دوستی‬) •‫شوند‬ ‫نمی‬ ‫ارثبری‬ ‫ها‬ ‫دوستی‬.‫کالس‬ ‫اگر‬ ‫یعنی‬A‫کالس‬ ‫دوست‬B‫فرزندان‬ ،‫باشد‬ ‫کالس‬A‫کالس‬ ‫دوست‬B‫نیستند‬. ‫بخوانید‬ ‫را‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫آن‬ ‫سازی‬ ‫پیاده‬ ‫و‬ ‫دوستی‬ ‫اعالن‬ ‫نحوه‬ ‫با‬ ‫آشنایی‬ ‫برای‬:
  • 67. // friend class #include <iostream> using namespace std; class Square; class Rectangle { int width, height; public: int area() { return (width * height); } void convert(Square a); };
  • 68. class Square { friend class Rectangle; private: int side; public: Square(int a) : side(a) {} }; void Rectangle::convert(Square a) { width = a.side; height = a.side; }
  • 69. int main() { Rectangle rect; Square sqr(4); rect.convert(sqr); cout << rect.area(); return 0; } ‫است‬ ‫زیر‬ ‫شکل‬ ‫به‬ ‫فوق‬ ‫کد‬ ‫خروجی‬: 16 ‫کالس‬ ‫از‬ ‫پوچ‬ ‫اعالن‬ ‫یک‬ ‫کد‬ ‫ابتدای‬ ‫در‬ ‫چرا‬ ‫بیاید‬ ‫پیش‬ ‫سوال‬ ‫این‬ ‫شما‬ ‫برای‬ ‫است‬ ‫ممکن‬ ‫حال‬Square ‫دارد؟‬ ‫وجود‬ ‫کلمه‬ ‫صورت‬ ‫این‬ ‫غیر‬ ‫در‬ ‫که‬ ‫است‬ ‫این‬ ‫سوال‬ ‫پاسخ‬Square‫کالس‬ ‫در‬ ‫رفته‬ ‫کار‬ ‫به‬Rectangle‫نامفهوم‬ ‫میشود‬.
  • 70. ‫نیست‬ ‫کالس‬ ‫دو‬ ‫میان‬ ‫تنها‬ ‫دوستی‬ ‫مفهوم‬.‫با‬ ‫کالس‬ ‫یک‬ ‫دوست‬ ‫نیز‬ ‫تابع‬ ‫یک‬ ‫است‬ ‫ممکن‬‫شد‬. ‫کرد‬ ‫معرفی‬ ‫کالس‬ ‫آن‬ ‫دوست‬ ‫عنوان‬ ‫به‬ ‫را‬ ‫تابع‬ ‫آن‬ ‫کالس‬ ‫نوشتن‬ ‫هنگام‬ ‫در‬ ‫باید‬ ‫منظور‬ ‫بدین‬.‫ا‬‫گر‬ ‫ک‬ ‫آن‬ ‫توابع‬ ‫و‬ ‫متغیرها‬ ‫به‬ ‫دسترسی‬ ‫قابلیت‬ ‫تابع‬ ‫آن‬ ‫یعنی‬ ،‫باشد‬ ‫کالس‬ ‫یک‬ ‫دوست‬ ‫تابعی‬‫را‬ ‫الس‬ ‫دارد‬.‫کنید‬ ‫توجه‬ ‫زیر‬ ‫کد‬ ‫به‬: class Rectangle { int width, height; public: Rectangle() {} Rectangle(int x, int y) : width(x), height(y) {} int area() { return width * height; } friend Rectangle duplicate(const Rectangle&); };
  • 71. Rectangle duplicate(const Rectangle& param) { Rectangle res; res.width = param.width * 2; res.height = param.height * 2; return res; }
  • 72. int main() { Rectangle foo; Rectangle bar(2, 3); foo = duplicate(bar); cout << foo.area() << 'n'; return 0; } ‫میباشد‬ ‫شکل‬ ‫بدین‬ ‫فوق‬ ‫برنامه‬ ‫خروجی‬: 24 ‫نکته‬:‫تابع‬ ‫فوق‬ ‫مثال‬ ‫در‬duplicate‫کالس‬ ‫دوست‬Rectangle‫میتواند‬ ‫علت‬ ‫همین‬ ‫به‬ ‫و‬ ‫میباشد‬ ‫آرگومانهای‬private‫کالس‬Rectangle‫دهد‬ ‫تغییر‬ ‫را‬.‫که‬ ‫کنید‬ ‫دقت‬duplicate‫کالس‬ ‫از‬ ‫تابعی‬ Rectangle‫نیست‬.
  • 73. ‫گرها‬ ‫اشاره‬(‫ادامه‬) ‫بازگرداننده‬ ‫توابع‬Reference:‫خروجی‬ ‫که‬ ‫میشوند‬ ‫تعریف‬ ‫طوری‬ ‫توابع‬ ‫اوقات‬ ‫گاهی‬ ‫جنس‬ ‫از‬ ‫تابع‬Reference‫میشود‬ ‫داده‬ ‫نوع‬ ‫یک‬.‫مثال‬ ‫عنوان‬ ‫به‬: int& function(int f) { f=f+3; return f; } ‫تابع‬ ‫این‬ ‫خروجی‬reference‫متغیر‬f‫بود‬ ‫خواهد‬. ‫میشد‬ ‫نوشته‬ ‫فوق‬ ‫مثال‬ ‫در‬ ‫اگر‬return 3;‫یا‬return f + 1;‫خطای‬ ‫با‬ ‫برنامه‬ ‫زیرا‬ ‫میشد‬ ‫مواجه‬ ‫کامپایلر‬Reference‫نمیشد‬ ‫بازگردانده‬( .‫باید‬ ‫خروجی‬lvalue ‫باشد‬.)
  • 74. lvalue:‫گیرد‬ ‫قرار‬ ‫انتساب‬ ‫عملیات‬ ‫یک‬ ‫چپ‬ ‫سمت‬ ‫بتواند‬ ‫که‬ ‫عبارتی‬ ‫به‬lvalue ‫میگویند‬. rvalue:‫بتواند‬ ‫که‬ ‫عبارتی‬ ‫به‬‫راست‬ ‫سمت‬‫گیرد‬ ‫قرار‬ ‫انتساب‬ ‫عملیات‬ ‫یک‬rvalue ‫میگویند‬. ‫بازگرداننده‬ ‫توابع‬ ‫خاصیت‬Reference‫که‬ ‫است‬ ‫این‬lvalue‫هستند‬.‫میتوان‬ ‫یعنی‬ ‫داد‬ ‫نسبت‬ ‫آنها‬ ‫به‬ ‫مقدار‬!!‫داده‬ ‫نسبت‬ ‫رفرنسی‬ ‫به‬ ‫شده‬ ‫داده‬ ‫نسبت‬ ‫مقدار‬ ‫تابع‬ ‫که‬ ‫شد‬ ‫خواهد‬return‫میکند‬. ‫ببینید‬ ‫را‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫مثال‬ ‫عنوان‬ ‫به‬:
  • 75. int* f(int* x) { (*x)++; return x; } int& g(int& x) { x++; return x; } int main() { int a = 0; cout << *f(&a) << endl; // Ugly (but explicit) cout << (g(a) = 10) << endl; // Clean (but hidden) g(a); cout << a << endl; }
  • 76. ‫گر‬ ‫اشاره‬void:‫خاطر‬ ‫همین‬ ‫به‬ ،‫میباشد‬ ‫خاص‬ ‫نوعی‬ ‫فاقد‬ ‫که‬ ‫است‬ ‫گری‬ ‫اشاره‬ ‫کند‬ ‫اشاره‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫هر‬ ‫به‬ ‫میتواند‬.‫پوی‬ ‫نوع‬ ‫این‬ ‫با‬ ‫کارکردن‬ ‫در‬ ‫که‬ ‫مشکلی‬‫نتر‬ ‫را‬ ‫آن‬ ‫نمیتوان‬ ،‫جنس‬ ‫بودن‬ ‫نامشخص‬ ‫علت‬ ‫به‬ ‫که‬ ‫است‬ ‫این‬ ‫دارد‬ ‫وجود‬ dereference‫کرد‬. ‫فرایند‬ ‫خاطر‬ ‫همین‬ ‫به‬dereference‫طریق‬ ‫از‬ ،‫کردن‬casting‫میشود‬ ‫انجام‬. ‫اش‬ ‫دریافت‬ ‫با‬ ‫که‬ ‫بنویسیم‬ ‫میخواهیم‬ ‫تابع‬ ‫یک‬ ‫کنید‬ ‫فرض‬ ‫مثال‬ ‫عنوان‬ ‫به‬‫از‬ ‫گری‬ ‫اره‬ ‫دهد‬ ‫افزایش‬ ‫واحد‬ ‫یک‬ ‫را‬ ‫آن‬ ‫مقدار‬ ،‫نامعین‬ ‫نوع‬. ‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
  • 77. void increaser(void* data, int psize) { if (psize == sizeof(char)) { char* pchar; pchar = (char*)data; ++(*pchar); } else if (psize == sizeof(int)) { int* pint = (int*)data; ++(*pint); } }
  • 78. int main() { char a = 'x'; int b = 1602; increase(&a, sizeof(a)); increase(&b, sizeof(b)); printf("%ct%dn", a, b); }
  • 79. ‫گرها‬ ‫اشاره‬ ‫اولیه‬ ‫دهی‬ ‫مقدار‬: ‫سرگردان‬ ‫گر‬ ‫اشاره‬(Wild Pointer):‫اولیه‬ ‫دهی‬ ‫مقدار‬ ‫که‬ ‫میگویند‬ ‫گری‬ ‫اشاره‬ ‫به‬ ‫ک‬ ‫و‬ ‫میکند‬ ‫اشاره‬ ‫حافظه‬ ‫در‬ ‫نامعینی‬ ‫فضای‬ ‫به‬ ‫گری‬ ‫اشاره‬ ‫چنین‬ ،‫باشد‬ ‫نشده‬‫با‬ ‫ار‬ ‫شود‬ ‫حافظه‬ ‫در‬ ‫ناخواسته‬ ‫تغییرات‬ ‫بروز‬ ‫موجب‬ ‫است‬ ‫ممکن‬ ‫گر‬ ‫اشاره‬ ‫نوع‬ ‫این‬. int* p; //p is a wild pointer ‫گر‬ ‫اشاره‬null:‫اولی‬ ‫مقداردهی‬ ‫حافظه‬ ‫صفر‬ ‫خانه‬ ‫با‬ ‫که‬ ‫میگویند‬ ‫گری‬ ‫اشاره‬ ‫به‬‫ه‬ ‫است‬ ‫شده‬.‫در‬ ‫همواره‬ ‫حافظه‬ ‫صفر‬ ‫خانه‬ ‫چون‬ ‫که‬ ‫است‬ ‫این‬ ‫مقداردهی‬ ‫این‬ ‫دلیل‬ ‫در‬ ،‫نمیشود‬ ‫داده‬ ‫ما‬ ‫به‬ ‫آن‬ ‫دسترسی‬ ‫حق‬ ‫هیچگاه‬ ‫و‬ ‫است‬ ‫عامل‬ ‫سیستم‬ ‫اختیار‬ ‫از‬ ‫و‬ ‫کرد‬ ‫خواهد‬ ‫اعالم‬ ‫را‬ ‫خطا‬ ‫ما‬ ‫به‬ ‫برنامه‬ ‫ناخواسته‬ ‫های‬ ‫مقداردهی‬ ‫انجام‬ ‫صورت‬ ‫شد‬ ‫خواهد‬ ‫جلوگیری‬ ‫ناخواسته‬ ‫تغییرات‬. int* p = 0; //p is a null pointer
  • 80. ‫ثابتها‬ ‫و‬ ‫گرها‬ ‫اشاره‬: ‫ثابت‬ ‫گر‬ ‫اشاره‬:‫گ‬ ‫اشاره‬ ‫میکند‬ ‫اشاره‬ ‫از‬ ‫حافظه‬ ‫از‬ ‫خانه‬ ‫یک‬ ‫به‬ ‫تنها‬ ‫که‬ ‫گری‬ ‫اشاره‬ ‫به‬‫ر‬ ‫است‬ ‫تغییر‬ ‫غیرقابل‬ ‫شونده‬ ‫اشاره‬ ‫آدرس‬ ،‫میگویند‬ ‫ثابت‬. int n = 45; int* const cp = &n; ‫یادآوری‬:‫هستند‬ ‫ثابت‬ ‫گر‬ ‫اشاره‬ ‫ها‬ ‫آرایه‬. ‫ثابت‬ ‫به‬ ‫گر‬ ‫اشاره‬:‫تغییر‬ ‫غیرقابل‬ ‫متغیر‬ ‫یک‬ ‫اوقات‬ ‫گاهی‬(const)‫یک‬ ‫و‬ ‫میکنیم‬ ‫تعریف‬ ‫میدهیم‬ ‫اشاره‬ ‫آن‬ ‫به‬ ‫را‬ ‫گر‬ ‫اشاره‬.‫تغییرناپذی‬ ‫گر‬ ‫اشاره‬ ‫طریق‬ ‫از‬ ‫ثابت‬ ‫متغیر‬ ‫مقدار‬‫است‬ ‫ر‬. const int k = 108; const int* ptc = &k; ‫فوق‬ ‫مثال‬ ‫در‬ ‫کنید‬ ‫دقت‬ptc‫جنس‬ ‫از‬const int*‫جنس‬ ‫از‬ ‫نه‬ ‫میباشد‬int*!! ‫کردن‬ ‫تعریف‬ ‫صورت‬ ‫در‬ptc‫نوع‬ ‫از‬int*‫میشدیم‬ ‫مواجه‬ ‫مشکل‬ ‫با‬( .‫چرا؟‬)!
  • 81. ‫تابع‬ ‫به‬ ‫گر‬ ‫اشاره‬: •‫است‬ ‫ثابت‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ،‫آرایه‬ ‫یک‬ ‫نام‬ ‫همانند‬ ‫تابع‬ ‫یک‬ ‫نام‬. •‫قسمت‬ ‫آن‬ ‫در‬ ‫تابع‬ ‫درون‬ ‫کدهای‬ ‫که‬ ‫میدهد‬ ‫نشان‬ ‫را‬ ‫حافظه‬ ‫از‬ ‫آدرسی‬ ،‫تابع‬ ‫نام‬ ‫اند‬ ‫گرفته‬ ‫جای‬. •‫که‬ ‫است‬ ‫این‬ ‫مانند‬ ‫شود‬ ‫تعریف‬ ‫تابع‬ ‫به‬ ‫گری‬ ‫اشاره‬ ‫اگر‬ ‫بنابراین‬: ‫ثابت‬ ‫گر‬ ‫اشاره‬ ‫یک‬ ‫به‬ ‫گری‬ ‫اشاره‬‫است‬ ‫شده‬ ‫تعریف‬.
  • 82. #include <iostream> using namespace std; void error(char* s) { cout << s << endl; } int main() { void(*f1)(char*) = &error; //ok void(*f2)(char*) = error; // also ok; same meaning as &error f1("f1 function without dereference."); //ok (*f1)("f1 function with dereference."); //also ok f2("f2 function without dereference."); (*f2)("f2 function with dereference."); //also ok }
  • 83. ‫فایلها‬ ‫با‬ ‫کار‬ ‫انجام‬ ‫برای‬ ‫ما‬ ‫های‬ ‫برنامه‬ ‫االن‬ ‫تا‬I/O‫کتابخانه‬ ‫از‬iostream‫میکردند‬ ‫استفاده‬. ‫نام‬ ‫به‬ ‫کالسی‬ ‫با‬ ‫االن‬ ‫اما‬fstream‫تع‬ ‫فایلها‬ ‫با‬ ‫کردن‬ ‫کار‬ ‫برای‬ ‫که‬ ‫میشویم‬ ‫آشنا‬‫بیه‬ ‫است‬ ‫شده‬. ‫است‬ ‫زیر‬ ‫شرح‬ ‫به‬ ‫کالس‬ ‫زیر‬ ‫دو‬ ‫دارای‬ ‫کالس‬ ‫این‬: •Ifstream:‫فایل‬ ‫از‬ ‫ورودی‬ ‫خواندن‬ ‫برای‬ ‫کالسی‬ •Ofstream:‫آن‬ ‫روی‬ ‫بر‬ ‫نوشتن‬ ‫و‬ ‫فایل‬ ‫ایجاد‬ ‫برای‬ ‫کالسی‬ ‫های‬ ‫کتابخانه‬ ‫باید‬ ‫کالسها‬ ‫این‬ ‫از‬ ‫استفاده‬ ‫برای‬iostream‫و‬fstream‫برنامه‬ ‫در‬ ‫را‬ ‫خود‬include‫کنید‬.
  • 84. // writing on a text file #include <iostream> #include <fstream> using namespace std; int main() { ofstream myfile("example.txt"); // if no file exists, create one // ofstream myfile; myfile.open("example.txt"); if (myfile.is_open()) { myfile << "This is a line.n"; myfile << "This is another line.n"; myfile.close(); // close the stream } else cout << "Unable to open file"; return 0; }
  • 85. // reading a text file #include <iostream> #include <fstream> #include <string> using namespace std; int main() { string line; ifstream myfile("example.txt"); if (myfile.is_open()) { // getline returns 0 when there is nothing to read while (getline(myfile, line)) // reading a line from myfile stream cout << line << 'n'; myfile.close(); } else cout << "Unable to open file"; return 0; }
  • 86. ‫اطال‬ ،‫فایل‬ ‫یک‬ ‫روی‬ ‫بر‬ ‫نوشتن‬ ‫هنگام‬ ‫که‬ ‫داریم‬ ‫تصمیم‬ ‫مواقع‬ ‫از‬ ‫بسیاری‬ ‫در‬‫عات‬ ‫فایل‬ ‫به‬ ‫جدید‬ ‫اطالعات‬ ‫و‬ ‫ندهیم‬ ‫دست‬ ‫از‬ ‫را‬ ‫قبلی‬append‫شوند‬.‫چنین‬ ‫در‬ ‫کردن‬ ‫باز‬ ‫هنگام‬ ‫مواقعی‬stream،mode‫میکنیم‬ ‫مشخص‬ ‫نیز‬ ‫را‬ ‫عملیات‬. Open_Mode Flag ‫توضیحات‬ ios::app ‫هرچه‬،‫شود‬ ‫نوشته‬ ‫فایل‬ ‫این‬ ‫در‬‫فقط‬‫به‬ ‫شد‬ ‫خواهد‬ ‫افزوده‬ ‫آن‬ ‫انتهای‬. ios::ate ،‫نوشتن‬ ‫و‬ ‫خواندن‬ ‫گر‬ ‫اشاره‬‫فایل‬ ‫انتهای‬ ‫به‬ ‫شود‬ ‫می‬ ‫منتقل‬. ios::binary ‫تمامی‬‫صورت‬ ‫به‬ ‫فایل‬ ‫در‬ ‫موجود‬ ‫مقادیر‬ ‫میشوند‬ ‫گرفته‬ ‫نظر‬ ‫در‬ ‫باینری‬ ‫مقادیر‬. ios::in ‫فایل‬‫است‬ ‫شده‬ ‫باز‬ ‫خواندن‬ ‫برای‬. ios::out ‫برای‬ ‫فایل‬‫است‬ ‫شده‬ ‫باز‬ ‫نوشتن‬. ios::trunc ‫اگر‬‫قبلی‬ ‫اطالعات‬ ‫تمامی‬ ،‫داشت‬ ‫وجود‬ ‫فایل‬ ‫شد‬ ‫خواهد‬ ‫حذف‬ ‫آن‬.
  • 87. // Copying a file #include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream f1("input.txt", ios::binary); ofstream f2("output.txt", ios::trunc | ios ::binary); f2 << f1.rdbuf(); // read f1's buffer, write it in f2 return 0; }
  • 88. File-Position Pointers:،‫نوشتن‬ ‫یا‬ ‫خواندن‬ ‫صورت‬ ‫در‬ ‫میکند‬ ‫بیان‬ ‫که‬ ‫است‬ ‫گری‬ ‫اشاره‬ ‫شود‬ ‫نوشته‬ ‫یا‬ ‫خوانده‬ ‫باید‬ ‫فایل‬ ‫کجای‬. ‫دارند‬ ‫وجود‬ ‫گرها‬ ‫اشاره‬ ‫این‬ ‫جابجایی‬ ‫برای‬ ‫زیر‬ ‫دستور‬ ‫دو‬: •seekg (seek-get):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬ ‫را‬istream‫جابجا‬ ‫میکند‬. •tellg (tell-get):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬istream‫اعالم‬ ‫را‬ ‫میکند‬. •seekp (seek-put):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬ ‫را‬ostream‫جابجا‬ ‫میکند‬. •tellp (tell-put):‫محل‬ ‫دستور‬ ‫این‬File-Position Pointer‫روی‬ ‫بر‬ostream‫اعالم‬ ‫را‬ ‫میکند‬. ‫روی‬ ‫بر‬ ‫دهی‬ ‫آدرس‬ ‫برای‬ ‫هم‬ ‫زیر‬ ‫گر‬ ‫اشاره‬ ‫سه‬stream‫دارند‬ ‫وجود‬: ‫گر‬ ‫اشاره‬ ‫نام‬ ‫گر‬ ‫اشاره‬ ‫مکان‬ ios::beg stream ‫ابتدای‬ ios::cur File-Position Pointer ‫فعلی‬ ‫مکان‬ ios::end stream ‫انتهای‬
  • 89. ‫دستور‬ ‫با‬ ‫کردن‬ ‫کار‬ ‫راهنمای‬seek: // position to the nth byte of fileObject (assumes ios::beg) fileObject.seekg(n); // position n bytes forward in fileObject fileObject.seekg(n, ios::cur); // position n bytes back from end of fileObject fileObject.seekg(n, ios::end); // position at end of fileObject fileObject.seekg(0, ios::end);
  • 90. // obtaining file size #include <iostream> #include <fstream> using namespace std; int main() { streampos begin, end; // data type = File-Position Pointer ifstream myfile("example.bin", ios::binary); begin = myfile.tellg(); myfile.seekg(0, ios::end); end = myfile.tellg(); myfile.close(); cout << "size is: " << (end - begin) << " bytes.n"; return 0; }
  • 91. Namespaces ‫توابع‬ ‫و‬ ‫ها‬ ‫کالس‬ ،‫متغیرها‬ ‫کدام‬ ‫هر‬ ‫در‬ ‫که‬ ‫هستند‬ ‫برنامه‬ ‫از‬ ‫مجزایی‬ ‫قسمتهای‬ ‫اند‬ ‫شده‬ ‫سازی‬ ‫پیاده‬ ‫و‬ ‫تعریف‬ ‫خاص‬ ‫هدفی‬ ‫با‬ ‫متناسب‬. ‫هر‬ ‫اجزای‬namespace‫هستند‬ ‫دسترسی‬ ‫قابل‬ ‫شکل‬ ‫دو‬ ‫به‬ ‫تنها‬: •‫همان‬ ‫داخل‬namespace •‫آن‬ ‫از‬ ‫استفاده‬ ‫اعالم‬ ‫صورت‬ ‫در‬namespace(‫دستور‬ ‫از‬ ‫استفاده‬using) •‫به‬ ‫جزء‬ ‫آن‬ ‫دادن‬ ‫نسبت‬ ‫صورت‬ ‫در‬namespace‫برنامه‬ ‫در‬ ‫شده‬ ‫شناخته‬ (‫عملگر‬ ‫از‬ ‫استفاده‬::‫دسترسی‬ ‫برای‬) Namespace‫زبان‬ ‫در‬ ‫ها‬C++‫مشابه‬package‫در‬Java‫باشند‬ ‫می‬.‫که‬ ‫تفاوت‬ ‫این‬ ‫با‬ package‫ها‬flat‫اما‬ ‫هستند‬namespace‫میتوانند‬ ‫ها‬nested‫باشند‬.
  • 92. #include <iostream> using namespace std; namespace foo { int value() { return 5; } } namespace bar { const double pi = 3.1416; double value() { return 2 * pi; } } int main() { cout << foo::value() << 'n'; // accessing foo's value() cout << bar::value() << 'n'; // accessing bar's value() cout << bar::pi << 'n'; return 0; }
  • 93. #include <iostream> using namespace std; namespace first{ int x = 5; int y = 10; } namespace second { double x = 3.1416; double y = 2.7183; } int main() { using first::x; using second::y; cout << x << 'n'; cout << y << 'n'; cout << first::y << 'n'; cout << second::x << 'n'; return 0; }
  • 94. ‫مثال‬:‫چیست؟‬ ‫زیر‬ ‫کد‬ ‫خروجی‬ http://paste.ubuntu.com/23788331/ ‫ورودی‬: 5 4 1 2 2 3 1 3 4 5 ‫خروجی‬:2
  • 95. ‫مثال‬:‫چیست؟‬ ‫زیر‬ ‫کد‬ ‫خروجی‬ #include <iostream> using namespace std; namespace first_space { void func() { cout << "Inside first_space" << endl; } namespace second_space { void func(){ cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main() { func(); return 0; }
  • 96. Preprocessor Directives (Macros) Directive‫کامپایلر‬ ‫برای‬ ‫مفهومشان‬ ‫کامپایل‬ ‫روند‬ ‫در‬ ‫که‬ ‫هستند‬ ‫عباراتی‬ ‫ها‬ ‫است‬ ‫شده‬ ‫مشخص‬.‫عبارات‬ ‫این‬‫زبان‬ ‫در‬C++‫عالمت‬ ‫از‬ ‫بعد‬ ‫همیشه‬#‫آیند‬ ‫می‬. ‫شوند‬ ‫می‬ ‫بررسی‬ ‫کامپایل‬ ‫فرآیند‬ ‫شروع‬ ‫از‬ ‫قبل‬ ‫همواره‬ ‫عبارات‬ ‫این‬. ‫مشهورترین‬directive‫عبارت‬ ،‫اید‬ ‫دیده‬ ‫حال‬ ‫به‬ ‫تا‬ ‫که‬include‫میباشد‬.‫در‬ ‫که‬ ‫کتابخا‬ ‫چه‬ ‫به‬ ‫نیاز‬ ‫کامپایل‬ ‫از‬ ‫قبل‬ ‫میشود‬ ‫متوجه‬ ‫کامپایلر‬ ،‫اولیه‬ ‫بررسی‬‫هایی‬ ‫نه‬ ‫دارد‬.‫دیگر‬ ‫از‬directive‫به‬ ‫میتوان‬ ‫ها‬define،ifdef،endif‫و‬...‫کرد‬ ‫اشاره‬. define:‫کن‬ ‫تعریف‬ ‫کامپایلر‬ ‫برای‬ ‫را‬ ‫عبارت‬ ‫این‬. ifdef:‫بود‬ ‫شده‬ ‫تعریف‬ ‫کامپایلر‬ ‫برای‬ ‫اگر‬. ifndef::‫بود‬ ‫نشده‬ ‫تعریف‬ ‫کامپایلر‬ ‫برای‬ ‫اگر‬. endif:‫شرط‬ ‫پایان‬
  • 97. #include <iostream> using namespace std; #define getmax(a,b) ((a)>(b)?(a):(b)) #define x 5 int main() { int y; y = getmax(x, 2); cout << y << endl; cout << getmax(7, x) << endl; return 0; }
  • 98. ‫از‬ ‫باید‬ ‫کتابخانه‬ ‫یک‬ ‫دوباره‬ ‫کردن‬ ‫تعریف‬ ‫از‬ ‫جلوگیری‬ ‫برای‬ ،‫ای‬ ‫کتابخانه‬ ‫فایلهای‬ ‫نوشتن‬ ‫هنگام‬ ‫در‬directive‫کرد‬ ‫استفاده‬ ‫شرطی‬ ‫های‬. // add.h #ifndef ADD_H // if not defined #define ADD_H // then define int add(int x, int y); #endif // conditional statement finished ------------------------------- // add.cpp int add(int x, int y) { return x + y; } -------------------------------- // main.cpp #include <iostream> #include "add.h" int main() { std::cout << "The sum of 3 and 4 is " << add(3, 4) << std::endl; return 0; }
  • 99. ‫از‬ ‫دیگر‬ ‫یکی‬directive،‫نویسی‬ ‫برنامه‬ ‫در‬ ‫پرکاربرد‬ ‫های‬pragma‫باشد‬ ‫می‬.‫این‬ directive‫کند‬ ‫ایجاد‬ ‫کامپایل‬ ‫نحوه‬ ‫در‬ ‫تغییراتی‬ ‫میتواند‬.‫این‬ ،‫مثال‬ ‫عنوان‬ ‫به‬ directive‫برای‬ ‫بیشتری‬ ‫حجم‬ ‫که‬ ‫کند‬ ‫اعالم‬ ‫کامپایلر‬ ‫به‬ ‫میتواند‬stack‫نظر‬ ‫در‬ ‫بگیرد‬. ‫استاندارد‬ ‫ماکروهای‬:‫آنها‬ ‫کمک‬ ‫به‬ ‫و‬ ‫هستند‬ ‫شده‬ ‫تعریف‬ ‫همواره‬ ‫ماکروها‬ ‫این‬ ‫کرد‬ ‫دریافت‬ ‫میتوان‬ ‫سیستم‬ ‫از‬ ‫را‬ ‫اطالعاتی‬.
  • 100. #include <iostream> using namespace std; int main() { cout << "This is the line number " << __LINE__; cout << " of file " << __FILE__ << ".n"; cout << "Its compilation began " << __DATE__; cout << " at " << __TIME__ << ".n"; return 0; }
  • 101. ‫داده‬ ‫دیگر‬ ‫انواع‬ ‫ماسک‬‫ها‬ ‫داده‬ ‫نوع‬:‫برای‬ ‫دیگری‬ ‫اسامی‬ ‫از‬ ‫میتوان‬ ‫اوقات‬ ‫گاهی‬DataType‫ها‬ ‫کرد‬ ‫اعالن‬ ‫میتوان‬ ‫روش‬ ‫چندین‬ ‫به‬ ‫را‬ ‫اسامی‬ ‫این‬ ،‫کرد‬ ‫استفاده‬: •‫ماکروها‬ •using •typedef #define C char using C = char; typedef char C;
  • 102. Union:‫شبیه‬ ‫داده‬ ‫نوع‬ ‫این‬struct‫و‬class‫که‬ ‫تفاوت‬ ‫این‬ ‫با‬ ،‫میباشد‬: •‫ندارد‬ ‫تابع‬. •‫میشود‬ ‫گذاشته‬ ‫اشتراک‬ ‫به‬ ‫آن‬ ‫متغیرهای‬ ‫همه‬ ‫بین‬ ‫استفاده‬ ‫قابل‬ ‫حافظه‬.‫حا‬ ‫این‬‫فظه‬ ‫متغیر‬ ‫ترین‬ ‫پرحجم‬ ‫اندازه‬ ‫به‬Union‫است‬. union mix_t { int l; // 4 bytes struct { short hi; // 2 bytes short lo; // 2 bytes } s; // 4 bytes char c[4]; // 4 bytes } mix;
  • 103. Operator Overloading ‫و‬ ‫کرد‬ ‫تعریف‬ ‫ساختارها‬ ‫برای‬ ‫را‬ ‫عملگرها‬ ‫میشود‬ ‫نیاز‬ ‫گاهی‬ ‫نویسی‬ ‫برنامه‬ ‫در‬‫آن‬ ‫زبان‬ ،‫کرد‬ ‫سازی‬ ‫پیاده‬ ‫نویس‬ ‫برنامه‬ ‫نظر‬ ‫مورد‬ ‫شیوه‬ ‫به‬ ‫را‬ ‫عملگر‬C++‫برنامه‬ ‫به‬ ‫میش‬ ‫آشنا‬ ‫اپراتورها‬ ‫این‬ ‫با‬ ‫که‬ ‫میدهد‬ ‫را‬ ‫اپراتورها‬ ‫گذاری‬ ‫سربار‬ ‫امکان‬ ‫نویسان‬‫ویم‬ (‫بگیرید‬ ‫نظر‬ ‫در‬ ‫توابع‬ ‫مانند‬ ‫را‬ ‫اپراتورها‬ ‫میتوانید‬ ‫مطلب‬ ‫آسانتر‬ ‫فهم‬ ‫برای‬) ‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
  • 104. class Ratio { public: Ratio() : num(0), den(1) {} Ratio(int n, int d) : num(n), den(d) {} Ratio(const Ratio& r) { num = r.num; den = r.den; } void showRatio() const { cout << num << " numt" << den << " denn"; } const Ratio& operator=(const Ratio&); private: int num, den; };
  • 105. const Ratio& Ratio::operator=(const Ratio& r) { num = r.num; den = r.den; return *this; } int main() { Ratio c1(12, 7); Ratio c4, c5, c6, c3 = c1, c2(c1); c5.operator = (c2); c4 = c6 = c2; c1.showRatio(); c2.showRatio(); c3.showRatio(); c4.showRatio(); c5.showRatio(); c6.showRatio(); }
  • 106. Copy Constructor:‫کپی‬ ‫یک‬ ‫و‬ ‫کند‬ ‫دریافت‬ ‫را‬ ‫جنس‬ ‫همان‬ ‫از‬ ‫شی‬ ‫یک‬ ‫که‬ ‫ای‬ ‫سازنده‬ ‫به‬ ‫بسازد‬ ‫را‬ ‫آن‬ ‫از‬Copy Constructor‫گویند‬ ‫می‬.‫مشاهده‬ ‫را‬ ‫آن‬ ‫فراخوانی‬ ‫زیر‬ ‫عبارت‬ ‫در‬ ‫میکنید‬: Ratio c2(c1); //Copy Constructor ‫سوال‬:‫زیر‬ ‫امضای‬ ‫با‬ ‫را‬ ‫انتساب‬ ‫اپراتور‬ ‫اگر‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫در‬overload‫چه‬ ‫میکردیم‬ ‫افتاد؟‬ ‫می‬ ‫اتفاقی‬ void operator=(const Ratio&); ‫پاسخ‬:‫دستور‬ ‫با‬ ‫مواجهه‬ ‫هنگام‬ ‫در‬ ‫برنامه‬c4 = c6 = c2;‫زیرا‬ ‫میشد‬ ‫مشکل‬ ‫دچار‬ ‫انتساب‬ ‫از‬ ‫اپراتور‬ ‫این‬ ‫که‬ ‫مقداری‬c2‫به‬c6‫متغیر‬ ‫در‬ ،‫برمیگرداند‬c4‫میشود‬ ‫داده‬ ‫قرار‬. ‫سوال‬:،‫میشد‬ ‫نوشته‬ ‫اگر‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫در‬(c4 = c6) = c2‫افتاد؟‬ ‫می‬ ‫اتفاقی‬ ‫چه‬ ‫پاسخ‬:‫میشد‬ ‫مواجه‬ ‫خطا‬ ‫با‬ ‫برنامه‬( .‫ثابت‬ ‫به‬ ‫مقداردهی‬)
  • 107. class Counter { private: unsigned int count; public: Counter() : Counter(0) { cout << "No Arg Constructor" << endl; } Counter(int c) : count(c) { cout << "One Arg Constructor" << endl; } Counter(const Counter& r) { cout << "Copy Constrctor" << endl; count = r.count; } unsigned int get_count() const { return count; }
  • 108. Counter& operator ++ () { ++count; return *this; } Counter& operator ++ (int) { Counter temp = *this; count++; return temp; } };
  • 109. int main() { Counter c1, c2; cout << "nc1=" << c1.get_count(); cout << "nc2=" << c2.get_count(); ++c1; c2 = ++c1; cout << "nc1=" << c1.get_count(); cout << "nc2=" << c2.get_count(); c2 = c1++; ++++++c2; cout << "nc1=" << c1.get_count(); cout << "nc2=" << c2.get_count(); return 0; }
  • 110. ‫تذکر‬:‫که‬ ‫توابعی‬ ‫بازگشتی‬ ‫مقدار‬ ‫عنوان‬ ‫به‬ ‫نمیتوان‬ ‫را‬ ‫محلی‬ ‫شی‬ ‫یک‬Type& ‫گرفت‬ ‫نظر‬ ‫در‬ ‫برمیگردانند‬.‫ر‬ ‫خواهد‬ ‫بین‬ ‫از‬ ،‫تابع‬ ‫از‬ ‫بازگشت‬ ‫از‬ ‫پس‬ ‫شی‬ ‫زیرا‬‫و‬ ‫فت‬ Reference‫بود‬ ‫نخواهد‬ ‫معتبر‬ ‫آن‬ ‫به‬. ‫سوال‬:‫عبارت‬ ‫قبل‬ ‫صفحه‬ ‫کد‬ ‫در‬const‫دارد؟‬ ‫تاثیری‬ ‫چه‬ unsigned int get_count() const ‫پاسخ‬:get_count‫صورت‬ ‫به‬const member function‫میشود‬ ‫تعریف‬.‫چنین‬ ‫نمیتواند‬ ‫همچنین‬ ،‫ندارد‬ ‫خود‬ ‫در‬ ‫را‬ ‫ثابت‬ ‫غیر‬ ‫توابع‬ ‫فراخوانی‬ ‫توانایی‬ ‫تابعی‬‫مقدار‬ ‫دهد‬ ‫تغییر‬ ‫را‬ ‫کالس‬ ‫متغیرهای‬.‫ای‬ ‫تنها‬ ،‫بسازیم‬ ‫کالس‬ ‫از‬ ‫ثابت‬ ‫شی‬ ‫یک‬ ‫اگر‬‫نوع‬ ‫ن‬ ‫کرد‬ ‫فراخوانی‬ ‫آن‬ ‫برای‬ ‫میتوان‬ ‫را‬ ‫توابع‬. ‫کنید‬ ‫دقت‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬:
  • 111. class A { public: void Const_No(); // nonconst member function void Const_Yes() const; // const member function }; int main() { A obj_nonconst; // nonconst object obj_nonconst.Const_No(); // works fine obj_nonconst.Const_Yes(); // works fine const A obj_const = A(); // const object obj_const.Const_Yes(); // works fine (const object can call const function) obj_const.Const_No(); // ERROR (const object cannot call nonconst function) }
  • 112. ‫به‬ ‫متعلق‬ ‫که‬ ‫کنیم‬ ‫سربارگذاری‬ ‫طوری‬ ‫را‬ ‫اپراتورها‬ ‫بخواهیم‬ ‫است‬ ‫ممکن‬ ‫حال‬ ‫دهند‬ ‫انجام‬ ‫عملیات‬ ‫متغیر‬ ‫دو‬ ‫روی‬ ‫بر‬ ‫یا‬ ‫و‬ ‫نباشند‬ ‫خاصی‬ ‫کالس‬(‫عملگ‬ ‫همانند‬‫ر‬)+ ‫کنید‬ ‫دقت‬ ‫زیر‬ ‫لینک‬ ‫در‬ ‫موجود‬ ‫کد‬ ‫به‬( :‫قرار‬ ‫اینجا‬ ‫در‬ ‫کد‬ ‫باالی‬ ‫حجم‬ ‫علت‬ ‫به‬ ‫نگرفت‬) http://paste.ubuntu.com/13237504/
  • 113. Templates ‫قالبها‬(Templates)‫کد‬ ‫آن‬ ‫در‬ ‫که‬ ‫باشند‬ ‫می‬ ‫جنریک‬ ‫نویسی‬ ‫برنامه‬ ‫گذار‬ ‫بنیان‬ ‫شود‬ ‫می‬ ‫اجرا‬ ‫خاصی‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫از‬ ‫مستقل‬.‫هستن‬ ‫توابعی‬ ‫یا‬ ‫ها‬ ‫کالس‬ ‫قالبها‬‫د‬ ‫کنند‬ ‫می‬ ‫کار‬ ‫مختلف‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫با‬ ‫که‬. ‫شوند‬ ‫می‬ ‫تقسیم‬ ‫دسته‬ ‫دو‬ ‫به‬ ‫قالبها‬: •FunctionTemplates:‫به‬ ‫را‬ ‫متعددی‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫هر‬ ‫توانند‬ ‫می‬ ‫که‬ ‫توابعی‬ ‫کنند‬ ‫دریافت‬ ‫ورودی‬ ‫پارامتر‬ ‫عنوان‬. •ClassTemplates:‫کار‬ ‫به‬ ‫متعددی‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫داری‬ ‫نگه‬ ‫برای‬ ‫که‬ ‫هایی‬ ‫کالس‬ ‫روند‬ ‫می‬.
  • 114. FunctionTemplates ‫کن‬ ‫دریافت‬ ‫همجنس‬ ‫ورودی‬ ‫دو‬ ‫که‬ ‫بنویسید‬ ‫تابعی‬ ‫میخواهید‬ ‫که‬ ‫کنید‬ ‫فرض‬‫و‬ ‫د‬ ‫م‬ ‫این‬ ‫بتواند‬ ‫تابع‬ ‫این‬ ‫میخواهید‬ ‫کنید‬ ‫فرض‬ ‫حال‬ ،‫برگرداند‬ ‫را‬ ‫بزرگتر‬ ‫ورودی‬‫را‬ ‫قایسه‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫برای‬int،char‫و‬double‫دهد‬ ‫انجام‬.‫از‬ ‫استفاده‬ ‫عدم‬ ‫صورت‬ ‫در‬ Template‫سه‬ ‫باید‬ ‫شما‬ ،overload‫تابع‬ ‫برای‬ ‫مختلف‬max‫بنویسید‬.‫صورت‬ ‫در‬ ‫اما‬ ‫از‬ ‫استفاده‬FunctionTemplate‫برای‬ ‫نوشت‬ ‫خواهید‬ ‫را‬ ‫تابع‬ ‫این‬ ‫بار‬ ‫یک‬ ‫تنها‬ ‫شما‬ ، ‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫مثال‬ ‫به‬ ‫موضوع‬ ‫این‬ ‫بهتر‬ ‫درک‬:
  • 115. #include <iostream> using namespace std; template <typename Type> // this is the template parameter declaration Type Max(Type tX, Type tY) { return (tX > tY) ? tX : tY; } int main() { int nValue = Max <int> (3, 7); // returns 7 [Same as Max(3,7)] double dValue = Max(6.34, 18.523); // returns 18.523 char chValue = Max('a', '6'); // returns 'a' } ‫نام‬ ‫به‬ ‫فرضی‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫یک‬ ‫مثال‬ ‫این‬ ‫در‬Type‫سازی‬ ‫پیاده‬ ‫تابع‬ ‫کلی‬ ‫ماهیت‬ ‫آن‬ ‫کمک‬ ‫به‬ ‫که‬ ‫است‬ ‫شده‬ ‫تعریف‬ ‫یک‬ ‫را‬ ‫ای‬ ‫داده‬ ‫انواع‬ ‫سایر‬ ‫میتواند‬ ‫تابع‬ ‫این‬ ‫حال‬ ،‫است‬ ‫شده‬Type‫دهد‬ ‫انجام‬ ‫نیز‬ ‫آنها‬ ‫برای‬ ‫را‬ ‫عملیات‬ ‫این‬ ‫و‬ ‫کند‬ ‫فرض‬.
  • 116. ClassTemplates ClassTemplate‫جنس‬ ‫از‬ ‫متغیرهایی‬ ‫یا‬ ‫توابع‬ ‫که‬ ‫هستند‬ ‫کالسهایی‬ ‫ها‬Type ‫دارند‬ ‫شده‬ ‫تعریف‬ ‫فرضی‬.‫د‬ ‫ساختمان‬ ‫خواهید‬ ‫می‬ ‫کنید‬ ‫فرض‬ ‫نمونه‬ ‫عنوان‬ ‫به‬‫اده‬ Stack‫جنس‬ ‫از‬ ‫متغیر‬ ‫چندین‬ ‫نیاز‬ ‫برحسب‬ ‫است‬ ‫ممکن‬ ‫اما‬ ‫کنید‬ ‫سازی‬ ‫پیاده‬ ‫را‬ Stack‫حاوی‬ ‫آنها‬ ‫از‬ ‫یکی‬ ‫که‬ ‫بسازید‬int‫حاوی‬ ‫دیگر‬ ‫یکی‬ ،double‫حاوی‬ ‫دیگری‬ ‫و‬ string‫باشد‬.‫س‬ ‫که‬ ‫است‬ ‫این‬ ‫ابتدایی‬ ‫راه‬ ‫یک‬ ‫کنید؟‬ ‫می‬ ‫چه‬ ‫کار‬ ‫این‬ ‫انجام‬ ‫برای‬‫ه‬ ‫کالس‬ ‫بار‬Stack‫کنید‬ ‫سازی‬ ‫پیاده‬ ‫را‬ ‫آن‬ ‫ای‬ ‫داده‬ ‫نوع‬ ‫هر‬ ‫برای‬ ‫هربار‬ ‫و‬ ‫بنویسید‬ ‫را‬. ‫سازی‬ ‫پیاده‬ ،‫باشد‬ ‫می‬ ‫بهینه‬ ‫راه‬ ‫که‬ ‫دیگر‬ ‫راه‬Stack‫عنوان‬ ‫به‬ClassTemplate ‫باشد‬ ‫می‬.‫کار‬ ‫ای‬ ‫داده‬ ‫فیلدهای‬ ‫تمامی‬ ‫با‬ ‫که‬ ‫دارد‬ ‫را‬ ‫این‬ ‫قابلیت‬ ‫ساختار‬ ‫این‬‫کند‬. ‫کنید‬ ‫توجه‬ ‫بعد‬ ‫صفحه‬ ‫کد‬ ‫به‬ ‫مثال‬ ‫این‬ ‫بهتر‬ ‫درک‬ ‫برای‬:
  • 117. ‫مثال‬:‫چیست؟‬ ‫زیر‬ ‫کد‬ ‫خروجی‬ http://paste.ubuntu.com/15197774/
  • 118. ‫منابع‬: • http://www.cplusplus.com/doc/tutorial/ • http://www.tutorialspoint.com/cplusplus/ • http://stackoverflow.com/ • http://www.cprogramming.com/tutorial/ • ‫پاییز‬ ‫پیشرفته‬ ‫سازی‬ ‫برنامه‬ ‫اسالیدهای‬91‫بهشتی‬ ‫شهید‬ ‫دانشگاه‬ • ‫نویسی‬ ‫برنامه‬ ‫و‬ ‫کامپیوتر‬ ‫مبانی‬ ‫اسالیدهای‬‫پاییز‬93‫بهشتی‬ ‫شهید‬ ‫دانشگاه‬