访问修饰符用于实现称为数据隐藏的面向对象编程的重要功能。考虑一个真实的例子:
具有7名高级成员的公司董事会具有一些公司最高机密。因此,我们可以认为有7个人作为类数据成员或成员职能,他们可以直接彼此访问秘密信息,但除了这7个成员之外,任何人都无法访问此信息,即外部人员没有特权就无法直接访问信息。这就是数据隐藏。
类中的访问修饰符或访问说明符用于设置类成员的可访问性。也就是说,它对类成员设置了一些限制,使其不能被外部函数直接访问。
C++中提供了三种访问修饰符:
- Public
- Private
- Protected
注意:如果我们没有为类内的成员指定任何访问修饰符,则默认情况下,成员的访问修饰符将为Private。
现在让我们详细了解这些访问修饰符:
1.Public:Public声明的所有类成员将对所有人开放。声明为public的数据成员和成员函数也可以由其他类访问。 可以使用具有该类对象的直接成员访问运算符(.)从程序中的任何位置访问该类的公共成员。
示例:
// C++ program to demonstrate public // access modifier #include using namespace std; // class definition class Circle { public: double radius; double compute_area() { return 3.14*radius*radius; } }; // main function int main() { Circle obj; // accessing public datamember outside class obj.radius = 5.5; cout << "Radius is: " << obj.radius << ""; cout << "Area is: " << obj.compute_area(); return 0; }
输出:
Radius is: 5.5Area is: 94.985
在上面的程序中,数据成员radius是公共的,因此我们可以在类之外访问它。
2.Private:声明为Private的类成员只能由该类内部的函数访问。类之外的任何对象或函数都不允许直接访问它们。只允许成员函数或friend函数访问类的私有数据成员。
示例:
// C++ program to demonstrate private // access modifier #include using namespace std; class Circle { // 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 Circle obj; // trying to access private data member // directly outside the class obj.radius = 1.5; cout << "Area is:" << obj.compute_area(); return 0; }
输出:
In function 'int main()':11:16: error: 'double Circle::radius' is private double radius; ^31:9: error: within this context obj.radius = 1.5; ^
上面程序的输出将是编译时错误,因为不允许我们直接在类外部访问类的私有数据成员。
但是,我们可以使用类的公共成员函数间接访问类的私有数据成员。下面的程序说明了如何执行此操作:
// C++ program to demonstrate private // access modifier #include using namespace std; class Circle { // private data member private: double radius; // public member function public: void compute_area(double r) { // member function can access private // data member radius radius = r; double area = 3.14*radius*radius; cout << "Radius is: " << radius << endl; cout << "Area is: " << area; } }; // main function int main() { // creating object of the class Circle obj; // trying to access private data member // directly outside the class obj.compute_area(1.5); return 0; }
输出:
Radius is: 1.5Area is: 7.065
3.Protected:受保护的访问修饰符与私有访问修饰符相似,不同之处在于,声明为“Protected”的类成员在类外部无法访问,但可以由该类的任何子类(派生类)访问。
示例:
// C++ program to demonstrate // protected access modifier #include using namespace std; // 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 the derived class can // access the protected data members of the base class obj1.setId(81); obj1.displayId(); return 0; }
输出:
id_protected is: 81