7. 1. // Read s integers from cin and return their
2. // sum; s is assumed to be positive.
3. double read_and_sum(int s)
4. {
5. Vector v;
6. vector_init(v, s); // Allocate s elements for v
7. for (int i=0; i!=s; ++i)
8. cin >> v.elem[i];
9.
10. double sum = 0;
11. for (int i=0; i!=s; ++i)
12. sum += v.elem[i];// Take the sum of the elements
13.
14. return sum;
15. }
8. 1. class Vector
2. {
3. public:
4. Vector(int s) : elem(new double[s]), sz(s) {}
5. double& operator[](int i) { return elem[i]; }
6. int size() { return sz; }
7.
8. private:
9. double* elem; // Pointer to the elements
10. int sz; // The number of elements
11. };
9. 1. class Vector
2. {
3. public:
4. Vector(int s) : elem(new double[s]), sz(s) {}
5. double& operator[](int i) { return elem[i]; }
6. int size() { return sz; }
7.
8. private:
9. double* elem; // Pointer to the elements
10. int sz; // The number of elements
11. };
10. 1. enum Color { red, blue, green };
2. enum Traffic_light { green, yellow, red };
3.
4. Color col = Color::red;
5. Traffic_light light = Traffic_light::red;
11. 1. // Prefix increment: ++
2. Traffic_light& operator++(Traffic_light& t)
3. {
4. switch (t)
5. {
6. case Traffic_light::green: return t=Traffic_light::yellow;
7. case Traffic_light::yellow: return t=Traffic_light::red;
8. case Traffic_light::red: return t=Traffic_light::green;
9. }
10. }
11.
12. Traffic_light next = ++light; // next becomes green
Editor's Notes
در این ویدیو در مورد type هایی که کاربر یا برنامه نویس میتونه تعریف کنه صحبت می کنیم. برنامه نویس 3 جور type میتونه تعریف کنه.
Structure
class
و enumeration
در ویدیو های قبلی در مورد fundamental typeها صحبت کردیم و اونا رو معرفی کردیم
ولی C++ اجازه میده که علاوه بر fundamental typeها یکسری typeهای دیگه هم تعریف کنیم که جزء انواع تعریف شده ی پایه ای نباشند مثلا structure و کلاس و enumerationها
اولین قدم برای این که یک type جدید ایجاد کنیم اینه که عناصری که نیاز داریم رو در کنار هم جمع کنیم و به نوعی سازماندهی کنیم به اصطلاع یک data structure بسازیم. به این data structure در C++ به اختصار میگیم struct . یک Declaration از struct رو با هم ببینیم.
کلمه ی struct مشخص می کنه که می خوایم یک type جدید بسازیم و جلوی struct اسم اون type جدید رو می نویسیم. با یک آکولاد باز و بسته محدوده ی struct رو تعریف می کنیم و داخل اون typeهایی که نیاز داریم رو declare میکنیم. در انتهای struct هم حتما باید یک سمی کلون بذاریم.این type جدید اسمش vector هست و داخل اون یک sz به معنی size هست و یک pointer به نام elem از نوع double وجود داره.
Vector یا بردار مثل آرایه هست که در شکل مبینید. Sz تعداد عناصر رو نشون میده و elem هم به ابتدای آرایه اشاره میکنه.
برای دسترسی داشتن به اعضای struct باید از اپراتور . استفاده کنیم یعنی جلوی اسم متغییر از نوع struct یک . بذاریم و اسم عنصری که می خوایم رو جلوش بنویسیم.
در این مثال میبینید یک تابع به نام f داریم که خروجی اون از نوع void هست یعنی هیچی برنمی گردونه و 3 تا ورودی میگره. ورودی اول یک Vectorهست. ورودی دوم یک reference به یک Vector هست و ورودی آخر یک اشاره گر به یک Vector. در بدنه تابع 3 تا متغییر از نوع int تعریف کردیم و هر کدوم رو مقدار دهیم کردیم.
همون طور که میبینید برای دسترسی داشتن به اعضای struct در مورد خود struct و reference به یک struct مشابه هم عمل می کنیم چون reference مثل خود اون متغییر هست.
ولی برای pointer چون باید به صورت غیر مستقیم دسترسی پیدا کنیم از اپراتور -> استفاده می کنیم. اوپراتور فلش یه حسی از اینکه pv متغییر نیست و داره به یه جایی اشاره میکنه رو ایجاد میکنه.
در این مثال یک تابع داریم به نام vector_init که خروجی اون از نوع void هست یعنی هیچ خروجی نداره و 2 تا ورودی داره. اولی یک reference به یک Vector هست و دومی یک عدد صحیح هست. در بدنه تابع خط 3 یک اپراتور داریم به نام New. اپراتور new کارش اینه که هر چی جلوش بود رو در حافظه میسازه و یک اشاره گر به آدرس اون برمی گردونه. یعنی یک آرایه از نوع double می سازه که اندازه اون برابر s هست که از ورودی دریافت کردیم. فرض کنید توی s عدد 5 باشه. پس یک آرایه 5 تایی از double میسازه و آدرس شروع اون رو بر میگردونه که ما اون رو در elem ذخیره میکنیم.
در خط بعد هم s رو توی sz یا size میریزیم یعنی تعداد عناصر آرایه که با new ساختیم رو در sz ذخیره می کنیم
پس این تابع یک reference از یک vector به همراه یک size میگیره و یک vector برای ما میسازه. الان یک vector داریم که آدرس شروع اولین عنصر اون در elem ذخیره شده و تعداد عناصر اون در sz دخیره شده.
یک مثال دیگه از struct با هم می بینیم
در این مثال می خوایم از تابعی که در اسلاید قبل دیدیم استفاده کنیم. در این تابع یک vector رو declare کردیم به نام v و بعد اونو به تابع vector_init دادیم تا برای ما اونو بسازه. از اونجایی که اولین ورودی تابع vector_init یک reference به یک vector بود میتونیم خود v رو به عنوان ورودی بدیم به vector_init و هر کاری که تابع روی ورودی انجام میده مستقیما روی v هم انجام میشه.
در حلقه for از ورودی به تعداد عناصر آرایه با استفاده از cin یک عدد اعشاری رو از ورودی خوندیم و ریختیم توی elem و به ترتیب اونو پر کردیم.
در حلقه دوم هم تمام مقادیری که از ورودی گرفتیم با هم جمع کردیم و حاصل جمع همه ی عناصر vector رو به عنوان خروجی برگردوندیم.
تا اینجا ما با استفاده از struct تونستیم یک type جدید بسازیم و عناصر مورد نیاز برای نگه داری یک سری اطلاعات رو در اون ذخیره کنیم. و برای اینکه روی اون یک سری عملیات انجام بدیم چند تا تابع نوشتیم. حالا همه ی اون کار ها رو با استفاده از کلاس انجام میدیم. کلاس به ما امکان میده که کنترول بیشتری روی اعضای اون داشته باشیم و یکسری از کارهایی فقط مخصوص کلاسه رو اعضای کلاس انجام بدیم در حالی که از دید هر کسی که بیرون کلاسه مخفی نگه داشته میشن.
هر کلاس میتونه از یک مجموعه از اعضا تشکیل شده. این اعضا می تونه شامل memberها و functionها باشند. به functionهای کلاس method میگیم.
با استفاده از کلمه public و private سطح دسترسی به اون memberها رو مشخص می کنیم.
اعضای public کلاس از بیرون کلاس برای همه قابل دسترسی هستند و اعضای private فقط داخل کلاس قابل دسترسی هستند و کسی غیر از کلاس نمی تونه اونا رو دستکاری کنه.
یک تابع در کلاس داریم به نام constructor که از اون برای مقدار اولیه دادن به اعضای کلاس استفاده میشه. کاری که constructor میکنه مثل تابع vector_init هست که با هم بررسی کردیم. تابع constructor باید همنام با اسم کلاس باشه و نوع خروجی هم برای اون مشخص نمی کنیم حتی void هم نباید بنویسیم.
یک اوپراتور برای کلاس تعریف کردیم که با استفاده از اون میتونیم مثل آرایه به عناصر داخل کلاس دسترسی داشته باشیم. اسم این اپراتور subscript هست و با یک عدد به نام i به عنصر iام elem دسترسی پیدا می کنیم. شما می تونید برای یک کلاس تمام اپراتوری ها مثل جمع و تفریق و غیره رو با کلمه ی operator و بعد نوشتن اون اپراتور تعریف کنید.
با استفاده از متد size هم می تونیم تعداد عناصر موجود در vector رو ببینیم.
یکی دیگه از typeهایی که برنامه نویس میتونه ایجاد کنه enum یا متغییر های شمارشیه.
با کمک enum یکسری مقادیر به هم مرتبط رو دسته بندی می کنیم و برای اون ها اسم میگذاریم. مثلا می تونیم برای رنگها یک enum به نام color ایجاد کنیم و برای هر رنگ اسم بذاریم.
یا برای چراغ راهنمایی اسم بذاریم و یک enum به نام traffic light ایجاد کنیم و برای هر رنگ چراغ اسم بذاریم.
برای استفاده از enum هم به این صورت باید عمل کنیم. برای مقدار دهی به یک enum باید از :: بعد از اسم enum استفاده کنیم و بعد :: مقداری که میخوایم رو مینویسیم.
یک مثال از عملیاتهایی که می شه روی enum انجام داد. مثلا می تونیم یک اپراتور برای ++ کردن بنویسیم.
با استفاده از switch case که قبلا یاد گرقتیم ورودی رو با مقادیر enum چک می کنیم و رنگ چراغ بعدی رو بر میگردونیم.
نحوه ی استفاده از اپراتور رو در خط 12 می بینید.
در پایان یک جمع بندی بکنیم. در این ویدیو در مورد typeهایی که برنامه نویس میتونه تعریف کنه و با استفاده از اونا عملیاتهای جدیدی رو تعریف کنه رو بررسی کردیم با struct و کلاس آشنا شدیم و گفتیم که در کلاس میشه با استفاده از private و public کردن اعضای کلاس نحوه ی دسترسی داشتن با اعضا رو کنترول کرد. و همینطور enum رو معرفی کردیم و کاربرد اون رو با هم دیدیم.
امید وارم مفید بوده باشه
با تشکر