مفهوم کلاس در ++C
کلاس در ++C
مفهوم کلاس و شی زمانی که وارد برنامهنویسی شد، تحول عظیمی را در این زمینه بهوجود آورد. با استفاده از شیگرایی میتوان بزرگترین مسئله ها را به قطعات کوچک تقسیم کرده و حل کرد. با شیگرایی همچنین اشکالگیری از برنامهها راحتتر شده و انعطافپذیری بالاتری در کدنویسی وجود خواهد داشت. زبان ++C در ابتدا C with Class نام داشت و قرار بود تنها قابلیت شیگرایی را به قابلیتهای C اضافه کند. در این مقاله قصد داریم مفهوم کلاس در ++C را بههمراه ویژگیها و مبانی آن توضیح دهیم.
برنامه نویسی شی گرا، تاریخچه و مزایای آن
برنامه نویسی شی گرا (Object-oriented Programming – OOP) در اواسط قرن 20 و در دانشگاه MIT پا به عرصه حضور گذاشت. این سبک از برنامهنویسی که توسط گروه هوش مصنوعی این دانشگاه طراحی شد، نتوانست توجه برنامهنویسان را بهطور ویژهای جلب کند.
نکته جالب در مورد برنامهنویسی شیگرا، بالا رفتن محبوبیت در طول زمان است. معمولا پدیدههای جدید خصوصا در دنیای برنامهنویسی در ابتدا با استقبال ویژه روبرو شده در ادامه در میان تغییرات تازهتر فراموش میشوند. OOP اما با گذشت زمان محبوب و محبوبتر شد؛ تا جایی که امروز دیگر نمیتوان بدون تسلط بر آن و بهکارگرفتنش، حتی سمت برنامهنویسی موبایل یا وب رفت. شاید بپرسید دلیل این مسئله چیست؟
باید بگوییم هر چه صنعت دیجیتال پیشرفت میکند، مسائل ارائه شده به برنامهنویسان دشوارتر و حجیمتر خواهند شد. اگر چه ابزارهای کار هم به همان نسبت گسترده میشوند، ولی برای مثال یک اپلیکیشن موبایل امروزی دهها برابر اپلیکیشنهای ده سال قبل ویژگی و اجزا دارد. برای حل این مسئلههای بزرگ، انتخاب روشهای کلاسیک و بالابهپایین برنامهنویسی دیوانگی به نظر میرسد (تقریبا غیرممکن است)!
در واقع برنامهنویسان در مواجهه با این سبک مسائل مجبورند روشهایی مثل تقسیم مسئله به مسائل کوچکتر و حل تمام آنها برای رسیدن به حل کلی را به کار گیرند. اینجا است که شیگرایی نقش اول فیلم و قهرمان داستان خواهد شد. زیر پیادهسازی این روش حل مسئله بدون استفاده از کلاس و تعریف اشیا ممکن نخواهد بود.
مزایای برنامه نویسی شی گرا
اشکالگیری سادهتر کد
اگر از روش غیرشیگرا برای برنامهنویسی استفاده کنید، در زمان بروز مشکل یا خطا کار بسیار سختی در پیدا کردن منبع آن در کد خواهید داشت. تنها راهحل موجود در روش کلاسیک برنامهنویسی، کامنت گذاشتن روی خطوط کد است که باز هم نمیتواند به اشکالگیری کد چندهزار خطی کمک خاصی کند. در عوض زمانی که از شیگرایی استفاده میشود، اشکالات پیشآمده را راحت میتوان ریشهیابی کرد. مثلا کلاس محاسبات درست کار نمیکند.
جلوگیری از دوبارهکاری با استفاده از ارثبری
فرض کنید قرار است چند نژاد سگ را معرفی کنید. این سگ ها همگی در مفهوم «سگ» مشترکند و یکسری ویژگی (Attribute) مشترک برای تمام آنها وجود دارد. در برنامهنویسی شیگرا یکبار کلاس سگ را تعریف کرده و ویژگیهایی مثل قد، وزن، محل تولد، طرح پوست و سن را در آن قرار میدهیم. هر بار تنها با تعریف یک شی از کلاس سگ و مقدار دادن به این ویژگیها یک نژاد جدید را معرفی میکنیم.
حالا ممکن است برای «سگهای شکاری» ویژگی دیگری مثل «دید در شب» هم مهم باشد. لازم نیست یک کلاس جداگانه برای سگ شکاری ساخته و تمام ویژگیها را از اول بنویسیم. بلکه تنها لازم است کلاس سگ شکاری را ساخته و با ارثبری، ویژگیهای موجود در کلاس سگ را به آن بدهیم. در ادامه ویژگیهای جدید را وارد کرده و کلاس جدید را مورد استفاده قرار میدهیم.
انعطافپذیری و چندریختی
اگر در کلاس والد (مثل سگ برای سگ شکاری – کلاسی که از آن ارثبری انجام میشود) یک تابع را تعریف کنیم. این تابع در تمام کلاسهای فرزند مورد استفاده خواهد بود.
حل مسئله اثربخشتر
در زبانهایی مثل C که از شیگرایی پشتیبانی نمیکنند، برنامهنویس باید تمام مسئله را در قالب یک الگوریتم بالابهپایین حل کند. این شیوه حل مسئله شاید برای مسائل ساده و کوچک قابل استفاده باشد، اما در مسائل بزرگ و چندبخشی کدنویس را با مشکلات جدی روبرو خواهد کرد. با شیگرایی بهسادگی میتوان مسئله بزرگ را بهچندین مسئله کوچک تقسیم کرده و از طریق حل آنها به حل مسئله اصلی رسید.
مختصری درباره ++C و تاریخچه آن
همانطور که میدانید ++C یک ورژن گسترشیافته از زبان برنامهنویسی C است. دنیس ریچی در سال 1972 میلادی و روی یک مینیکامپیوتر بههمراه همکارش کن تامپسون توانست چیزی را پایهگذاری کند که بعدها بهعنوان نقطهعطفی در تاریخ برنامهنویسی شناخته شود. این زبان در زمان خود توانست توجهها را به خود جلب کرده و امکانات تازهای را در اختیار مهندسان نرمافزار و برنامهنویسان قرار دهد.
در سالهای انتهایی قرن 20 و با ورود کامپیوترهای خانگی به بازار، زبان برنامهنویسی C اهمیت بیشتری پیدا کرد. چون که با این زبان میتوانستید بسیار سادهتر از دیگر زبانهای موجود در آن زمان برای نرمافزار کامپیوتر برنامهنویسی کنید. این زبان هنوز هم برای کاربردهایی مثل نوشتن درایور برای کامپیوترها یا کار با پایگاه داده به کار گرفته میشود. اما بزرگترین مشکلی که در C وجود داشت، پشتیبانی نکردن از شیگرایی بود.
C With Classes
برای همین بود که 7 سال بعد از ارائه اولین ورژن C، یعنی در سال 1979 یک متخصص علوم کامپیوتر دانمارکی به نام «بیارن استروستراپ» پروژهای را تحت عنوان C With Classes یا همان سی به اضافه کلاس آغاز کرد. او در زبان برنامهنویسی Simula شیگرایی را دیده بود و به پتانسیل خوب آن برای استفاده شدن در پروژههای بزرگ نرمافزاری پیبرده بود.
زبانهای دیگری که در آن زمان از شیگرایی پشیتبانی میکردند یا خیلی کند بودند یا سطح خیلی پایینی (نزدیکی به زبان ماشین) داشتند. استروستراپ به این فکر افتاد که C را بهعنوان یک زبان سریع و سطح بالا، مجهز به شیگرایی کند. چه ایدهی خوبی!
بههرحال این ایده در حد یک تز دکترا باقیماند و طراحی زبان ++C بهصورت عملی به سال 1982 موکول شد. زمانی که استروستراپ در آزمایشگاه AT&T Bell مشغول بهکار شده بود. کارفرمایان او نیاز به تحلیل کرنل یونیکس با سیستم محاسباتی توزیعی داشتند و همین باعث شد ایده عملی کردن تز دکترا به ذهن استروستراپ خطور کند. در نهایت اولین نسخه ++C بهشکل رسمی در سال 1985 به بازار عرضه شد.
مفهوم کلاس در ++C
ویکیپدیا کلاس را اینگونه تعریف میکند «یک ساختار داده تعریف شده توسط کاربر که با کلیدواژه class به کامپایلر اعلام میشود و سه نوع دارد: private، public، protected.». بهعبارتدیگر، کلاس یک مفهوم بوده و اشیا مثالهایی از آن مفهوم هستند.
برای مثال کاج، چنار و گردو همگی اشیائی از کلاس درخت هستند. در کلاس یکسری ویژگی تعریف میشود که در تمام اشیا مشترک بوده و تنها مقدار آن برای هر شی متفاوت است. در مثالی دیگر میتوان برای مشتریان شرکت کلاس «مشتری» را ساخت. در این کلاس ویژگیهایی مثل «کد مشتری»، «نام مشتری» و «میزان خرید» تعریف میشوند. در ادامه هر بار که یک شی از این کلاس بسازیم این ویژگیها مقداردهی میشوند (مثلا 90921 – محمدرضا سامانی – 100000).
هر کلاس از دو بخش تشکیل میشود. بخش اول مربوط به تعریف ویژگیها بههمراه نوع داده (مثلا سن مشتری int) بوده و بخش دوم به توابع اختصاص دارد. این توابع میتوانند از نوع void یا دیگر انواع تابع باشند. در این توابع روی دادههای مربوط به ویژگیها عملیاتی انجام میشود. در ادامه مثالی از یک کلاس ساده با دو نوع داده و دو تابع آورده شده است.
class MT
{
private:
int age;
float score;
public:
void function1()
{ age = 2; }
float function2()
{
score = 3.5;
return score;
}
};
توابع خصوصی و عمومی
گاهی برنامهنویس نیاز دارد توابع یک کلاس خارج از آن قابل استفاده نباشند. در این صورت از کلیدواژه private قبل از بخش تعریف توابع در ساختار کلاس استفاده کرده و آنها را خصوصی میکند. اگر در این بخش از کلیدواژه public استفاده شود، توابع تعریف شده در کلاس میتوانند خارج از آن هم مورد استفاده قرار گیرند. همین روال برای دادههای تعریف دادهها (ویژگیها) برقرار است.
اشیا در ++C
وقتی کلاس ساخته شد میتوانید با ساختن یک شی در هرجای برنامه از توابع یا دادههای درون آن (در صورت پابلیک بودن) استفاده کنید. برای این کار از دستور زیر استفاده میشود:
ClassName objectVariableName;
در مورد کلاس MT که بالاتر تعریف کردیم خواهیم داشت:
MT t1,t2;
برای دسترسی به توابع یک کلاس هم اینگونه عمل میکنیم:
t1.function1();
در ادامه مثالی برای استفاده همزمان از شی و کلاس در برنامهنویسی ++C را مشاهده میکنید.
// Program to illustrate the working of objects and class in C++ Programming
#include <iostream>
using namespace std;
class Test
{
private:
int data1;
float data2;
public:
void insertIntegerData(int d)
{
data1 = d;
cout << "Number: " << data1;
}
float insertFloatData()
{
cout << "\nEnter data: ";
cin >> data2;
return data2;
}
};
int main()
{
Test o1, o2;
float secondDataOfObject2;
o1.insertIntegerData(12);
secondDataOfObject2 = o2.insertFloatData();
cout << "You entered " << secondDataOfObject2;
return 0;
}
تابع سازنده کلاس در ++C
تابع سازنده و مخرب دو مفهوم کلیدی برای برنامهنویسی شیگرا هستند. در واقع هر بار که اقدام به ساختن یک شی از کلاس و مقداردهی آن میکنیم، تابع سازنده آن صدا زده میشود. فراخوانی تابع سازنده به دو شکل انجام میشود:
- فراخوانی در بدنه کلاس
- فراخوانی در هنگام مقدار دهی شی
در ادامه مثالی از فراخوانی مستقیم (در بدنه کلاس) را میبینید:
class class_name
{
int g, h;
public:
class_name(void); // Constructor Declared
. . .
};
class_name :: class_name()
{
g=1; h=2; // Constructor defined
}
ویژگیهای تابع سازنده
- Public است.
- مقداری را برنمیگرداند.
- همیشه در زمان ساخت شی، اتوماتیک صدا زده میشود.
- امکان ارثبری از آن وجود ندارد.
- میتواند آرگومان ورودی داشته باشد.
- امکان ارجاع دادن به خانه آن در حافظه وجود ندارد.
- نمیتواند به صورت مجازی تعریف شود.
نتیجه گیری کلاس در ++C
نوشتن برنامه صفحههای اینترنتی یا برنامههای موبایل بدون شیگرایی غیرممکن میشود. این قابلیت اولین بار در سال 1950 در دانشگاه MIT توسعهداده شد و نتیجه آن زبانی مثل Simula بود. پس از عرضه زبان C یک متخصص علوم کامپیوتر دانمارکی به فکر اضافه کردن شیگرایی به زبان سطحبالا و سریع C افتاد. او این کار را برای تز دکترایش بهصورت تئوری انجام داد و 3 سال بعد در آزمایشگاه AT&T زبان ++C را خلق کرد. در حال حاضر هر دوی این زبانها شهرت و کاربردی جهانی دارند اما بزرگترین نقص C همچنان نداشتن شیگرایی است. در این مقاله به مفهوم کلاس در ++C، مزایا و شیوه کار با آن پرداختیم. امیدواریم این مطالب برای شما مورد استفاده واقع شود. نظرات خود را از بخش کامنت با ما در میان بگذارید.