درود فراوان به شما همراهان عزیز. در قسمت دهم آموزش، اولین قسمت از سری OOP در ++C رو براتون گفتیم. اما در این مطلب به مهمترین بخش قسمت شی گرایی یعنی کلاس در c++ و نحوه کار با آنها میپردازیم. اما قبل از شروع این مبحث بهتر است نوعی دیگر از دادهها به نام string بیان شود. همراه ما باشید.
نوع دادهای string
string یا رشته در واقع نوعی متغیر است که می توان در آن یک عبارت رشتهای قرار داد. برای استفاده از string باید کتابخانهی string به اول برنامه الحاق شود.
1 2 3 4 5 6 7 8 9 10 11 |
#include <string> #include <iostream> using namespace std; int main() { string name = "Mohammad"; cout << name << endl; getchar(); return 0; } |
1 2 |
Mohammad |
نوع دادهای string هم مانند بقیه متغیرها مقداردهی می شود. هم میتواند مقدار اولیه بگیرد و یا اینکه هرجای برنامه که احتیاج بود مقدار آن را تغییر داد. برای مقدار دادن هم باید عبارت رشتهای خود را بین ” ” نوشت.
برنامهنویسی شیء گرایی چیست؟
دو دستهی حیوان و انسان را در نظر بگیرید. به فرض مثال بنده محمد نصر خصوصیات پایه یک انسان را دارم. چشم دارم، دماغ دارم، دهان دارم و … اما انسان دیگری را در نظر بگیرید. آن انسان باز هم مثل من چشم، دماغ و دهن دارد با این تفاوت که رنگ چشم ها، انحنای دماغ و اندازهی دهان ما دو نفر کاملا متفاوت است.
حال به حیونات توجه کنید. برای مثال ببر و گربه را در نظر بگیرید. هر دو خصوصیاتی مشترک دارند. هر دو پا دارند، سر دارند و چشم هم دارند. اما اندازه و شکل هر قسمت از این دو حیوان به کلی متفاوت است.
اما منظور از برنامه نویسی شیء گرایی چیست؟ در برنامهنویسی شی گرایی، به دادههایی که ساختاری پیچیده داشته باشند یک شیء گفته میشود و ارتباط میان اشیا توسط قوانین شیء گرایی بیان میشود. قوانین مثل : کلاس، وراثت، کپسوله سازی، سطوح دسترسی و …. در این پست ابتدا مفهوم کلاس را بیان می کنیم.
کلاس چیست؟
کلاس نوع جدید دادهای ماست. نوعی جدید از داده که ساختار آن توسط ما تعریف میشود. برای تعریف کلاس در c++ از کلمه کلیدی class استفاده می شود. ساختار یک کلاس در c++ بصورت زیر است:
1 2 3 4 |
class <نام کلاس> { اجزای کلاس }; |
برای تعریف باید کلمه class و سپس یک نام برای کلاس نوشته شود. اجزای کلاس از متدها و فیلدها تشکیل شده اند. وقتی تابعی درون کلاس تعریف شود دیگر به آن تابع نمیگویند بلکه متد گفته میشود. فیلدها منظور نوع های دادهای هستند مثل int، float، string و غیره. توجه شود که فیلدها خود می توانند دارای نوعی دادهای دیگری باشند که ما تعریف کرده ایم. به عنوان مثال:
1 2 3 4 5 6 |
class Person { public: int age; std::string name; } |
کلاسی به نام Person تعریف کردیم که دو فیلد دارد: age از نوع int و name از نوع string. دو نکته باید ذکر شود. اول اینکه هنگام تعریف یک متغیر از نوع string در یک کلاس باید فضای نام std قبل از آن ذکر شود چون کامپایلر موقع کامپایل کردن کلاس string را نمیشناسد. دوم اینکه کلمه کلیدی public که اول کلاس گذاشتیم مربوط به سطح دسترسی است که در جلسه دوازدهم به آن میپردازیم.
چگونه از کلاس در c++ استفاده کنیم؟
تا اینجای کار ما کلاس را تعریف کردیم. استفاده از آن همانند تعریف و مقداردهی متغیرها است. به کد زیر دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Person { public: int age; std::string name; } int main() { Person p1, p2; p1.name = "Ahmad"; p1.age = 36; p2.name = "Reza"; p2.age = 14; cout << p1.name << endl; cout << p1.age << endl; cout << p2.name << endl; cout << p2.age << endl; getchar(); return 0; } |
1 2 3 4 5 |
Ahmad 36 Reza 14 |
پس از تعریف کلاس، در داخل main دو شیء از کلاس Person با نام های p1 و p2 ساختیم. مثل این در نظر بگیرد که دو متغیر مثلا از نوع int ساخته شد. اما اینجا p1 و p2 از نوع جدید دادهای Person هستند. حال p1 و p2 دو شئ کاملا متفاوت هستند که هر کدام تنها دو فیلد دارند: یکی age و یکی هم name. برای دسترسی به فیلدهای یک شی باید از نقطه و سپس نام فیلد استفاده کرد. دقت شود که هم میتوان روی فیلد نوشت و هم میتوان آنها را خواند.
مثالی دیگر از کلاس در c++
به عنوان مثال دوم، یک متد به کلاس Person اضافه میکنیم. متد را مانند رفتارهای یک فرد در نظر بگیرید. پس هر کلاس هم میتواند رفتارهایی در غالب متد داشته باشد. کلاس Person را بصورت زیر بازنویسی میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Person { public: int age; std::string name; std::string WhoAreYou(); }; std::string Person::WhoAreYou() { std::string answer; answer = "I am " + name + " and I have " + std::to_string(age) + " years old."; return answer; } |
حال کلاس Person از دو فیلد و یک متد تشکیل شده است. فلیدها که تغییری نکردهاند. اما متدی به نام WhoAreYou تعریف کردیم که نوع برگشتی آن string است و هیچگونه پارامتر ورودی ندارد. کار این متد استفاده از اطلاعات age و name است و جملهای به نام answer را برمیگرداند. دقت شود که اول متد در داخل کلاس تعریف میشود و دوم اینکه بیرون کلاس محتوای آن مشخص خواهد شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class Person { public: int age; std::string name; std::string WhoAreYou(); }; std::string Person::WhoAreYou() { std::string answer; answer = "I am " + name + " and I have " + std::to_string(age) + " years old."; return answer; } int main() { Person p1, p2; p1.name = "Ahmad"; p1.age = 36; p2.name = "Reza"; p2.age = 14; cout << p1.WhoAreYou() << endl; cout << p2.WhoAreYou() << endl; getchar(); return 0; } |
پس از تعریف کلاس، دو شیء از آنها ساختیم و سپس فیلدهای age و name هرکدام را مقداردهی کردیم. در نهایت متد ()WhoAreYou هر کدام از اشیاء را صدا زدیم. خروجی این متد یک رشته است که برگردانده شده و روی کنسول چاپ میشود.
1 2 3 |
I am Ahmad and I have 36 years old. I am Reza and I have 14 years old. |
نکته: تابع ()to_string یکی از توابع مهم کتابخانه string است که کار آن تبدیل نوع های دادهای مختلف به رشته است. از آنجایی که جنس age از نوع int است، باید ابتدا آن را به رشته تبدیل کرد و سپس استفاده نمود.
جمع بندی
اگر بخواهیم به صورت کلی به برنامه نگاه کنیم، ما نوع دادهای به نام Person ساختیم که یک انسان را توصیف میکند. حال ما قادریم که بی نهایت شیء از آن ایجاد کنیم که هر کدام یک انسان را توصیف میکند.
به عنوان جمع بندی، کلاس ساختاری است که ما متناظر با برنامهای که مدنظر داریم تعریف میکنیم. به متغیری که از روی کلاس ساخته میشوند، شیء میگویند و میتوان بی انتها شیء از روی کلاس ایجاد کرد. در مطلب بعدی آموزش در مورد سازندهی کلاس یا constructor صحبت میشود.
امیدوارم که از این مطلب که در مورد کلاس در c++ بود نهایت استفاده رو برده باشید. با رزدینو همراه باشید و نظرات و پیشنهادات خودتون رو با ما در میان بگذارید. 😉
یک پاسخ
مطالبتون عالیه من به صورت self study کل cpp یاد گرفتم از جاهای مختلف و حتی مطالب انگلیسی اما شما ب صورت خیلی مفهومی توضیح دادید ک ادم میفهمه موقع نوشتن یاید چیکار کنه. ممنون