در این قسمت تیم کدگیت را با آموزش سطح دسترسی ها در سی پلاس پلاس همراهی کنید. در ابتدا Data hiding را معرفی سپس با معرفی انواع سطح دسترسی، مثالهایی از آنها پیاده سازی میکنیم. پیش نیاز این آموزش شامل موارد زیر است:
سطح دسترسی ها در سی پلاس پلاس
سطح درسترسیها باعث ایجاد یکی از ویژگیهای مهم شی گرایی میشود. این ویژگی را Data Hiding میگویند. یک مثال واقعی را در نظر میگیریم. فرض کنید یک راننده ترمز خود را فشار دهد چه اتفاقی خواهد افتاد؟ ماشین متوقف میشود!! راننده برای اینکه ماشین متوقف شود میداند که باید ترمز بگیرد اما آیا اتفاقی که واقعا رخ میدهد این است؟ راننده آگاهی ندارد که درون موتور ماشین چه اتفاقی میافتد تا ماشین متوقف شود و حتی چگونگی اتصال موتورها به چرخها و …. خبر ندارد. این دقیقا چیزی است که در Data Hiding رخ میدهد.
برای پیاده سازی Data Hiding باید با انواع سطح دسترسی ها در سی پلاس پلاس آشنا شویم:
- Public
- Private
- Protected
Public
تمام اعضای کلاسی که در زیر کلمه کلیدی Public: قرار میگیرند قابل دسترسی برای تمام کلاسهای دیگر هستند. تمامی متغیرهای عمومی و توابع که Public هستند را میتوان از کلاسهای دیگر صدا زد. برای درک بهتر این مسئله، کد زیر را ببینید:
class PublicCircle {
public:
double radius;
double compute_area() {
return 3.14 * radius * radius;
}
};
// main function
int main() {
PublicCircle obj;
// accessing public datamember outside class
obj.radius = 5.5;
cout << "Radius is:" << obj.radius << "\n";
cout << "Area is:" << obj.compute_area();
return 0;
}
همانطور که در کد بالا میبینید کلاسی به نام PublicCircle است که برای محاسبه مساحت دایره نوشتیم. در این کلاس متغیر Radius و تابع compute_area به صورت Public هستند و توسط تابع Main قابل دسترسی بوده و توانستهایم به راحتی آنها را صدا بزنیم.
Private
تمامی متغیرها و توابعی که به صورت Private درون یک کلاس تعریف میشوند نمیتوان از کلاسهای دیگر به صورت مستقیم به آنها دسترسی داشت (البته Friend Function استثنا هستند). کد مثال دایره را به صورت Private ببینید:
class PrivateCircle
{
// private data member
private:
double radius;
// public member function
public:
double compute_area()
{ // member function can access private
// data member radius
return 3.14*radius*radius;
}
};
// main function
int main() {
// creating object of the class
PrivateCircle obj2;
// trying to access private data member
// directly outside the class
obj2.radius = 1.5;
cout << "Area is:" << obj2.compute_area();
return 0;
}
کد بالا موقع کامپایل ارور خواهد داد. دلیل آن استفاده از متغیر Private در تابعی خارج از کلاس PrivateCircle است. در تابع Main ما متغیر radius را صدا زدیم که به صورت Private است و نمیتوان به آن دسترسی داشت. برای اجرای برنامه باید تغییرات زیر را اعمال کنیم:
double compute_area(double r)
{ // member function can access private
// data member radius
radius = r;
return 3.14*radius*radius;
}
Protected
آخرین سطح دسترسی ها در سی پلاس پلاس Protected است. این سطح دسترسی شبیه به Private است با این تفاوت که کلاسهایی که از کلاس ما ارث بری میکنند نیز میتوانند توابع و متغیرهای ما را صدا بزنند. اما کلاسهای دیگر نمیتوانند به متغیرها و توابع Protected دسترسی داشته باشند. مثال زیر را در همین مورد ببینید:
// base class
class Parent
{
// protected data members
protected:
int id_protected;
};
// sub class or derived class
class Child : public Parent
{
public:
void setId(int id)
{
// Child class is able to access the inherited
// protected data members of base class
id_protected = id;
}
void displayId()
{
cout << "id_protected is:" << id_protected << endl;
}
};
// main function
int main() {
Child obj1;
// member function of derived class can
// access the protected data members of base class
obj1.setId(81);
obj1.displayId();
return 0;
}
یک کلاس به نام Parent داریم که متغیری به نام id_protected دارد و به صورت Protected تعریف شده است. ما کلاسی به نام Child تعریف کردیم که فرزند کلاس Parent است. در کلاس Child ما به متغیر id_protected دسترسی داشته و آن را چاپ کردیم. دقت کنید از تابع Main به صورت مستقیم نمیتوانیم به متغیر id_protected دسترسی پیدا کنیم.