C++中访问权限的示例详解

 更新时间:2021年7月1日 15:00  点击:1260

众所周知,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外,还能被该类的对象访问。

  private protected public
类的函数和友元函数
子类的函数 ×
类的对象 × ×

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

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

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

总结

到此这篇关于C++中访问权限的文章就介绍到这了,更多相关C++访问权限内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • 详解SpringBoot之访问静态资源(webapp...)

    这篇文章主要介绍了详解SpringBoot之访问静态资源(webapp...),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-14
  • 浅谈关于如何检测iOS14本地网络权限的一些思路

    这篇文章主要介绍了浅谈关于如何检测iOS14本地网络权限的一些思路,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • phpMyadmin创建数据库和设置用户权限图解

    phpmyadmin是一款很不错的WEB对mysql数据库管理软件,如果你想创建数据库与设置用户权限我们必须操作用户的很高的权限,如ROOT权限,下面我来给大家介绍介绍。 先来配...2016-11-25
  • C++如何删除map容器中指定值的元素详解

    map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
  • C++ 约瑟夫环问题案例详解

    这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15