类成员的访问权限

del.icio.us Tags: C++, protected, access

总所周知,在一个class中,其三层访问权限为:外界只能访问public成员,其子类可以访问protected和public成员,自己可以访问private,protected和public。但是,下面的例子是一个奇怪的反例。

  1: class A
  2: {
  3: public:
  4:     A() : x(0) {}
  5:     int foo(A a)
  6:     {
  7:         return this->x + a.x;
  8:     }
  9: private:
 10:     int x;
 11: };
 12: 
 13: class B
 14: {
 15: public:
 16:     B() : y(0) {}
 17: protected:
 18:     int y;
 19: };
 20: 
 21: class C : public B
 22: {
 23: public:
 24:     C() {}
 25:     int bar(B* b)
 26:     {
 27:         return this->y + b->y;
 28:     }
 29: };
 30: 
 31: int main()
 32: {
 33:     A a1, a2;
 34:     a1.foo(a2);
 35: 
 36:     B b;
 37:     C c;
 38:     c.bar(&b);
 39:     return 0;
 40: }

编译时,你会发现,foo的调用是对的,但是bar的调用出错。告诉你`int B::y’ is protected。这里问题就来了。C继承B,那么相应继承了B的成员y,为什么就不能用b->y的形式呢。当然不能,原因编译器已经给出,protected成员只能通过子类来直接访问,例如c->y,但是对于b->y的形式,相当于外界访问,这是不允许的。那么又有问题了,A::foo中,就可以在外界直接访问A::x,例如a.x,但是A::x是private,应该只能在类内通过this->x访问,不能通过a.x来访问,要访问应该加上a.get_x()这样的函数。问题就在这里。

在C++中,类的三层访问权限是本类对于外类来说的。就是说,我有一个class A,对于另一个class B来说,其objects可以访问A的objects的public成员;若B是A的子类,那么同时也可以其访问protected成员。但是,对于同属于A类的所有objects,它们之间是可以访问所有成员的。举个例子,同一个班级的学生可以看到自己班级里的任何东西(class A的所有objects互访所有信息),不属于本班的学生就只能看到被公布出来的信息(class B的所有objects只能看到A的public信息)。但是两个班有些共享信息(protected部分),但只能通过特定的手段来看(B的objects来访问),不能直接看(直接通过A的objects来访问)。

为什么这样做呢?对于内部不设防,有一定关系的通过一定方法访问,其它没有联系的一概拒绝。首先,对于同类objects间的访问,这是拷贝构造函数得以实现的关键,不然你没有办法通过A的另一个object来构造新的object,因为无法访问private成员。也许会说,只要用get,set便好。但是这白白增加了函数调用负担,而且如果没有写get/set呢,岂不是什么也不能做。所以,对于类内,一切都是可见的。对于类外,当然,有保留地访问,可以有效封装,增加安全性。

这个问题来自 云风的博客,看了他的解释“所谓私有,是针对类的,而不是具体的对象”,没有明白,干脆自己写,再问问身边的人,仔细想想,大概明白了。
在C++中,类成员有三种访问权限控制符:`public`, `private`, 和 `protected`。它们决定了的数据成员和函数成员可以在哪里以及如何被访问。 ### 1. public(公共) 声明为 `public` 的成员可以被程序中的任何部分直接访问。 - **数据成员** 可以自由地读取和修改。 - **成员函数** 可以由该的对象、派生对象或者其他外部代码调用。 ```cpp class Example { public: int pubVar; // 公共变量 void setPub(int x) { pubVar = x; } // 公共函数 }; ``` ### 2. private(私有) 声明为 `private` 的成员只能在这个内部的成员函数或友元函数中使用,外界无法直接访问这些成员。 - 这有助于隐藏实现细节并保护数据的安全性和完整性。 ```cpp class Example { private: int privVar; void setPriv() {} // 私有函数 }; ``` ### 3. protected(受保护) 当一个成员被标记为 `protected` ,在其所属及其所有衍生内它是可见并且可用;但是对其他非继承自此的地方而言它仍然是不可见且不能访问的。 - 它常用于让子能够共享某些功能而不对外公开这些信息。 ```cpp class BaseClass { protected: int protVar; }; class Derived : public BaseClass { public: void accessProtectedMember() { cout << "Protected Member Value:" << this->protVar << endl; } }; ``` 通过合理运用这三者之间的差异特性,我们可以设计出既安全又具有良好结构特性的应用程序组件模型。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值