public: x can be used anywhere without the access restrictions defined by private or protected.
private: x can be used only by the members and friends of class A.
protected: x can be used only by the members and friends of class A, and the members and friends of classes derived from class A.
Members of classes declared with the keyword class are private by default. Members of classes declared with the keyword struct or union are public by default.
To control the access of a class member, you use one of the access specifiers public, private, or protected as a label in a class member list. The following example demonstrates these access specifiers:
struct A {The following table lists the access of data members A::a A::b, and A::c in various scopes of the above example.
friend class C;
private:
int a;
public:
int b;
protected:
int c;
};
struct B : A {
void f() {
// a = 1;
b = 2;
c = 3;
}
};
struct C {
void f(A x) {
x.a = 4;
x.b = 5;
x.c = 6;
}
};
int main() {
A y;
// y.a = 7;
y.b = 8;
// y.c = 9;
B z;
// z.a = 10;
z.b = 11;
// z.c = 12;
}
Scope | A::a | A::b | A::c |
---|---|---|---|
function B::f() | No access. Member A::a is private. | Access. Member A::b is public. | Access. Class B inherits from A. |
function C::f() | Access. Class C is a friend of A. | Access. Member A::b is public. | Access. Class C is a friend of A. |
object y in main() | No access. Member y.a is private. | Access. Member y.a is public. | No access. Member y.c is protected. |
object z in main() | No access. Member z.a is private. | Access. Member z.a is public. | No access. Member z.c is protected. |
class A {
class B;
public:
class B { };
};
The compiler will not allow the definition of class B because this class has already been declared as private.
A class member has the same access control regardless whether it has been defined within its class or outside its class.Access control applies to names. In particular, if you add access control to a typedef name, it affects only the typedef name. The following example demonstrates this:
class A {
class B { };
public:
typedef B C;
};
int main() {
A::C x;
// A::B y;
}
The compiler will allow the declaration A::C x because the typedef name A::C is public. The compiler would not allow the declaration A::B y because A::B is private.
No comments:
Post a Comment