C++中的访问权限怎么定义
创始人
2024-12-21 04:21:40
0次

众所周知,C++面向对象的三大特性为:封装,继承和多态。下面我们就先对封装做一些简单的了解。封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具。类的定义如下:

class circle
{
    public: //成员变量
      int  m_L;
      int  m_H;
    public: //成员函数(方法)
      double get_Square()
      {
        return m_L*m_H;
      }
}

在上面的代码中,我们定义了一个 "circle" 类,主要包含三个部分:成员变量,成员方法和访问控制(public, protect, private)。

  1. public:公共权限,类内可以访问,类外可以访问

  2. protected:保护权限,类内可以访问,类外不可以访问,继承的子类可以访问

  3. private:私有权限,类内可以访问, 类外不可以访问,继承的子类不可以访问

下面我们的对这三点进行测试,以加深印象:

class circle
{
 public:
  int  public_L;
  int  public_H;
 private: 
  int  private_L;
  int  private_H;
 protected:
  int protect_L;
  int protect_H;
 
public: //成员函数(方法)
  circle() //通过构造函数对成员变量进行赋值
  {
   public_L = 20, public_H = 30;
   private_L = 40, private_H = 50;
   protect_L = 60, protect_L = 70;
  }
  double get_Square()
  {
   return private_L*private_H;
  }
};

在定义的 "circle" 类中,由于变量 public_L,public_H 和 get_Square 都是公有权限,因此在类内类外均可访问,下面这两种写法均正确:

circle C1; //实例化类对象
double S_1 = C1.get_Square();
double S_2 = C1.public_H * C1.public_L;

但是,由于变量 private_L,private_H 均为私有权限, 因此在类内可以访问,即 get_Square() 能够访问,在类外下面的写法是错误的:

int S_3 = C1.private_H * C1.private_L; //Error:成员变量不可访问

同理,对于保护权限的变量,类内可以访问,类外不可访问:

int S_3 = C1.private_H * C1.private_L; //Error:成员变量不可访问

同样,继承的方式也有 public, protect, private 三种:

  • public:公共继承,保持父类中成员的访问权限,继承到子类

  • protected:保护继承,除私有权限外,父类中所有的成员都以保护权限的方式继承到子类

  • private:私有继承,父类中所有的成员都以私有权限的方式继承到子类。

下面看一个例子:

class son1:public circle{
}; // 公有继承,保持 circle 父类中的访问权限不变
class son2:protected circle{
}; // 保护继承,除去 circle 父类中私有权限,其余成员你的的访问权限全部为保护权限
class son3:private circle{
}; // 私有继承,父类中所有成员的访问权限全部为私有权限

那么通过上述分析,

  • son1 的访问权限与父类一致;

  • son2 只能在类内访问父类中的成员,但是他的子类中也可以通过public或者protected继承的方式访问到父类 "circle" 中的成员

  • son3 只能以私有的方式来继承父类中的成员

所以:

son1 s1;
s1.get_Square(); //访问public权限,正确

son2 s2;
s2.get_Square(); //Error:成员变量不可访问,protected权限

son3 s3;
s3.get_Square(); //Error:成员变量不可访问,private权限

C++中,类既可以用class 定义,也可以用struct定义。struct与class唯一的区别就在于默认访问权限不同struct默认为公共访问权限,Class默认为私有访问权限。举个例子:

class a
{
 int m_a; //class 定义,未声明访问权限默认为private
};

struct b
{
 int m_b; //struct 定义,未声明访问权限默认为public
};

于是:

a c_a;
c_a.m_a = 20; // Error: 成员变量不可访问

b s_b;
s_b.m_b = 20; // 正确,访问public类型变量

C++中类的成员的权限总结:

private:只能由该类的成员函数,友元函数访问,不能被该类的对象访问。

protected:除了private外还能被子类的函数访问,同样不能被该类的对象访问。

public:除了protected外,还能被该类的对象访问。


privateprotectedpublic
类的函数和友元函数√√√
子类的函数×√√
类的对象××√

继承后的可访问性:
private继承后,父类中的所有方法在子类中变成private。

protected继承后,父类>=protected的所有方法(protected,public)在子类中变成protected。

public继承后,父类方法的属性不变。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...