C++的封装(十五):第四种访问控制
- 互联网
- 2025-08-22 21:24:02

C++的访问控制有public, protected, private 3种。代表全局允许,子类允许,私有3种访问权限。Java有4种,如果什么都没写,就是默认,代表在同一个包中可以随便访问。初学者对C++的访问控制还没深入理解,使用时常常设置的自相矛盾,弄得自己头大。看到Java有第4种访问权限,觉得Java好,都转到Java去了。
在同一个包中可以随便访问。这在C++当然也根本不是什么难事。
“一个包”,也是一个类,比如就叫class Abc好了。包里有3个类, class A, class B, class C,记作:Abc::A,Abc::B, Abc::C。要允许他们之间自由访问,都用friend声明就完了:
class Abc { public: class A; class B; class C; class A { int x; public: int get() {return x;} friend class Abc::B; friend class Abc::C; }; class B{ int y; public: int get() {return y;} friend class Abc::A; friend class Abc::C; }; class C { int z; public: int get() {return z;} friend class Abc::A; friend class Abc::B; }; private: A a; B b; C c; };你可能对用了那么多friend声明有些反感。那么,都用struct就好了,用struct就不用再声明friend了:
class Abc { public: struct A { int x; public: int get() {return x;} }; struct B{ int y; public: int get() {return y;} }; struct C { int z; public: int get() {return z;} }; private: A a; B b; C c; };可是,这里的struct还是不想让外面访问呀。不想让外面访问,把struct搬到private部分去声明就完了。(代码略)
可是,这个类名字和其中的public方法又要允许外面访问呀。要允许外面访问,在公有部分在弄个类继承一下这个struct就完了… 啊?这样搞啊?
最后,这个代码就是下面这种样子。现在,大家都知道,并没有什么java的访问控制好,在C++里办不到这种问题了:
class Abc { struct A_dat { int x; }a; struct B_dat { int y; }b; struct C_dat { int z; } c; public: class A; class B; class C; class A: A_dat { public: int get() {return x;} }; class B: B_dat { public: int get() {return y;} }; class C: C_dat { public: int get() {return z;} }; int geta() {return a.x;} void seta(int a) {this->a.x=a;} A *ptr() { return (A*)&a; } }; #include <stdio.h> int main() { Abc abc; Abc::A *pa; abc.seta(100); printf("%d\n", abc.geta()); pa= abc.ptr(); printf("%d\n", pa->get()); return 0; }C++的封装(十五):第四种访问控制由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++的封装(十五):第四种访问控制”