OOP-访问限制

  • public

公用的,任何人都可以访问

  • private

私有的,类的成员函数可以访问,同一个类的对象可以互相访问private

#include <iostream>
using namespace std;
class A
{
private:
    int i;
    int *p;

public:
    A()
    {
        p = 0;
        cout << "A::A()" << endl;
    }
    ~A()
    {
        if (p)
        {
            delete p;
            cout << "A::~A()" << endl;
        }
    }
    void set(int ii)
    {
        i = ii;
    }
    void f()
    {
        p = new int;
    }
    void g(A *q)
    {
        cout << "A::g(),q->i=" << q->i << endl;
    }
};
int main()
{
    A *p = new A[3];
    for (int i = 0; i < 3; i++)
    {
        p[i].set(i);
    }
    A b;
    b.set(100);
    p[0].g(&b); //友元访问
    delete[] p;
    return 0;
}
  • protected

类的子子孙孙可以访问,但是不能访问private

  • c++的Friends

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);

可以自由访问其private

一个例子

#include <iostream>
using namespace std;
class Point //声明
{
public:
    Point(double xx, double yy)
    {
        x = xx;
        y = yy;
    } //默认构造函数
    friend double Distance(Point &a, Point &b); //友元函数
private:
    double x, y;
};
double Distance(Point &a, Point &b) //注意函数名前未加类声明符
{
    double dx = a.x - b.x;
    double dy = a.y - b.y;
    return dx * dx + dy * dy;
}
int main()
{
    Point p1(3.0, 4.0), p2(6.0, 8.0);
    double d = Distance(p1, p2);
    cout << "Distance is " << d << endl;
}

在这里插入图片描述

class vs struct
class默认private sturct默认public 继承的几种方式上述第一层访问控制符(即派生列表中)影响的是派生类中基类部分成员(函数或变量)的访问控制权限(也仅仅只有这一点影响),具体的影响为:
(1)public继承(保持不变):派生类中基类部分的成员(函数或变量)的访问控制权限和其在基类中声明的权限一样;
(2)protected继承(各自降低一个权限):基类中public成员在派生类中变成protected权限,其他成员都变为private权限;
(3)private继承(全部私有化):派生类中基类部分的成员(函数或变量)的访问控制权限全部变为private成员。一个关于访问限制的例子

一个关于访问限制的例子

class Base
{
public:
    int pub_mem;

protected:
    int pro_mem;

private:
    int pri_mem;

    //对类自身来说,其成员函数,无论何种权限说明,都可以访问类中的任何权限的成员变量
public:
    int base_fun_pub() {}

protected:
    int base_fun_pro() {}

private:
    int base_fun_pri() {}
};

class Drived : public Base
{
    //pub、pro、pri成员函数都能访问其基类部分的public、protected成员变量,但都不能访问private成员
public:
    int drived_fun_pub()
    {
        pub_mem = 0; //情况(1)
        pro_mem = 0; //情况(2)
        pri_mem = 0; //情况(3)(错误,不能访问)
    }

protected:
    int drived_fun_pro()
    {
        pub_mem = 0; //情况(1)
        pro_mem = 0; //情况(2)
        pri_mem = 0; //情况(3)(错误,不能访问)
    }

private:
    int drived_fun_pri()
    {
        pub_mem = 0; //情况(1)
        pro_mem = 0; //情况(2)
        pri_mem = 0; //情况(3)(错误,不能访问)
    }

private:
    int j;
};

void main()
{
    /******************单层public继承为例**********************/
    Drived drivedobj;
    drivedobj.pub_mem; //情况(1)
    drivedobj.pro_mem; //情况(2)(错误,不能访问)
    drivedobj.pri_mem; //情况(3)(错误,不能访问)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值