C++ 类的访问权限public、protected、private

(1)不继承方面来说,private,public,protected属性和方法的访问范围.

private: 

 只能由1.该类中的函数、2.其友元函数访问。(属性和方法派生类都不可以访问,不管是什么继承)

不能被任何其他访问,该类的对象也不能访问。

protected: 

可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。

public:

可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。

注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。详细请看

/*********************************************************************************************************************/
(2)类的继承后方法属性变化: 
使用private继承,父类的所有方法在子类中变为private; 
使用protected继承,父类的protected和public方法在子类中变为protected,private方法不变; 

使用public继承,父类中的方法属性不发生改变; 


(不可用:说明基类的private属性和方法,不管什么继承,子类都不可以访问)

扫描二维码关注公众号,回复: 1025605 查看本文章
  public protected private
public继承 public protected 派生类不可用
protected继承 protected protected 派生类不可用
private继承 private private 派生类不可用

上面表格说明,子类继承父类后的访问范围,继承后的属性和方法继续适合(1)中所说的。总结为:

1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问(不能被继承),不能被对象访问

2.protected可以被继承,但是不能被对象访问

3.public可以被继承也可以被访问。

4.类体内的访问没有访问限制一说,即private函数可以访问public/protected/private成员函数或数据成员,同理,protected函数,public函数也可以任意访问该类体中定义的成员。

虽然派生类不可使用基类的private成员,但是派生类的对象内存确实包含private成员。

/*********************************************************************************************************************/

看下面的例子

#include <IOSTREAM>
using namespace std;

class A{
public:
    A(int i_,int j_)
    {
        i=i_;
        j=j_;
    }
    void disp(A &a)   ===>有点类似友元函数
    {
        cout<<a.i<<endl<<a.j<<endl;
    }

private:
    int i;
protected:
    int j;
};

int main(int argc, char* argv[])
{
    A a(123,456);
    A b(789,543);
    a.disp(b);
    b.disp(a);

    return 0;
}

初看起来,倒是会产生疑问。为什么会这样,是否有bug?
仔细考究起来,我们其实可以这样看待类和对象:
类是将数据成员和进行于其上的一系列操作(成员函数)封装在一起,注意:成员函数可以操作数据成员(可以称类中的数据成员为泛数据成员)!

①对象是类的实例化,怎样理解实例化?

其实每一个实例对象都只是对其中的数据成员初始化,内存映像中每个对象仅仅保留属于自己的那份数据成员副本。而成员函数对于整个类而言却是共享的,即一个类只保留一份成员函数。

②那么每个对象怎样和这些可以认为是“分离”的成员函数发生联系,即成员函数如何操作对象的数据成员?

记住this指针,无论对象通过(.)操作或者(->)操作调用成员函数,编译时刻,编译器都会将这种调用转换成我们常见的全局函数的形式,并且多出一个参数(一般这个参数放在第一个),然后将this指针传入这个参数。于是就完成了对象与成员函数的绑定(或联系).

③实例化后就得到同一个类的多个不同的对象,既然成员函数共享的,那么成员函数就可以操作对象的数据成员。 问题是现在有多个对象,成员函数需要知道操作的是哪个对象的数据成员?
比如有对象obj1和obj2,都属于A类,A类有public成员函数foo()。 如果obj1调用该函数,编译时会给foo函数传入this指针obj1,foo中操作obj1自身的成员就不用任何修饰,直接访问,因为其中的数据成员自动根据this指针找到。
如果obj1调用该函数,同样可以访问同类的其他对象的数据成员!那么你需要做的是让foo函数知道是同类对象中哪个对象的数据成员,一个解决办法是传入同类其他对象的指针或引用,那么就可以操作同类其他对象的数据成员。
foo(A &obj)
这样定义,然后调用:
obj1.foo(obj2)
就可以在obj1访问obj2的数据成员,而无论这些数据成员是private还是protected。


总结:C++的访问修饰符的作用是以类为单位,而不是以对象为单位。

通俗的讲,同类的对象间可以“互相访问”对方的数据成员,只不过访问途径不是直接访问.
步骤是:通过一个对象调用其public成员函数,此成员函数可以访问到自己的或者同类其他对象的public/private/protected数据成员和成员函数(类的所有对象共用),而且还需要指明是哪个对象的数据成员(调用函数的对象自己的成员不用指明,因为有this指针;其他对象的数据成员可以通过引用或指针间接指明)

猜你喜欢

转载自blog.csdn.net/qq_31930499/article/details/80292637