Access modifiers

Access modifiers (or access specifiers) are keywords in object-oriented languages that set the accessibility of classes, methods, and other members. Access modifiers are a specific part of programming language syntax used to facilitate the encapsulation of components.[1]

In C++, there are only three access modifiers. C# extends the number of them to six,[2] while Java has four access modifiers,[3] but three keywords for this purpose. In Java, having no keyword before defaults to the package-private modifier.

When the class is declared as public, it is accessible to other classes defined in the same package as well as those defined in other packages. This is the most commonly used specifier for classes. However, a class itself cannot be declared as private. If no access specifier is stated, the default access restrictions will be applied. The class will be accessible to other classes in the same package but will be inaccessible to classes outside the package. When we say that a class is inaccessible, it simply means that we cannot create an object of that class or declare a variable of that class type. The protected access specifier too cannot be applied to a class.

Names of keywords

C++ uses the three modifiers called public, protected, and private.[4] C# has the modifiers public, protected ,internal, private, protected internal, and private protected. Java has public, package, protected, and private. The access modifier package is the default and used, if any other access modifier keyword is missing. The meaning of these modifiers may differ from one language to another. A comparison of the keywords, ordered from the most restrictive to the most open, and their meaning in these three languages follows. Their visibility ranges from the same class to the package where the class is defined to a general access permission. Below, the maximal access is written into the table.

KeywordC#C++Java
privateclassclass

and/or

friend classes

class
private protectedderived classes in the same assembly--
protected internalsame assembly
and/or
derived classes
--
protectedderived classesderived classes

and/or

friend classes

derived classes
and/or
within same package
package--within its package
internalsame assembly--
publiceverybodyeverybodyeverybody

Example in C++

#include <iostream>
#include <conio.h>
using std::cout;
using std::endl;

struct B { // default access modifier inside struct is public
    void set_n(int v) { n = v; }
    void f()          { cout << "B::f" << endl; }
  protected:
    int m, n; // B::m, B::n are protected
  private:
    int x;
};
 
struct D : B {
    using B::m;               // D::m is public
    int get_n() { return n; } // B::n is accessible here, but not outside
//  int get_x() { return x; } // ERROR, B::x is inaccessible here
 private:
    using B::f;               // D::f is private
};
 
int main() {
    D d;

//  d.x = 2; // ERROR, private
//  d.n = 2; // ERROR, protected
    d.m = 2; // protected B::m is accessible as D::m

    d.set_n(2); // calls B::set_n(int)
    cout << d.get_n() << endl; // output: 2

//  d.f();   // ERROR, B::f is inaccessible as D::f


    B& b = d; // b references d and "views" it as being type B

//  b.x = 3; // ERROR, private
//  b.n = 3; // ERROR, protected
//  b.m = 3; // ERROR, B::m is protected

    b.set_n(3); // calls B::set_n(int)
//  cout << b.get_n(); // ERROR, 'struct B' has no member named 'get_n'

    b.f();   // calls B::f()
    return 0;
}
gollark: Üṅïċöḋë ḅṛïṅġṡ öṅḷÿ ṁäḋṅëṡṡ∵
gollark: 𝕌𝕟𝕚𝕔𝕠𝕕𝕖 𝕓𝕣𝕚𝕟𝕘𝕤 𝕠𝕟𝕝𝕪 𝕞𝕒𝕕𝕟𝕖𝕤𝕤.
gollark: Did... did you put an umlaut on a `>`?
gollark: Tronzoid is confusion.
gollark: We are all CONFUSION.

References

Notes

  1. Mayo 2002, pp. 199.
  2. Wagner, Bill. "Access Modifiers - C# Programming Guide". docs.microsoft.com. Retrieved 2020-01-13.
  3. "Access Modifiers In Java". Javapapers. Retrieved 2020-01-13.
  4. "Access specifiers". en.cppreference.com. Retrieved 2020-01-13.

Bibliography

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.