C++成员权限控制(总结)

1) 前言

在我学习C++的过程中,类中成员的权限控制一直是比较头疼的一个点,一会public,一会又private,还有protected,再加点继承,而且又有公有继承、私有继承,保护继承,所以感觉会比较乱。

后来不断学习过程中,慢慢理顺了它们的关系,稍微分类总结一下,在这个问题上基本上就没再栽过跟头。如有笔误,希望大神指点一下!

2 )C++的水平权限控制

首先解释几个特定词,下面要用到:

水平权限:在一个类中,成员的权限控制,就是类中的成员函数能否访问其他成员、类的对象能否访问类中某成员。

垂直权限:在派生类中,对从基类继承来的成员的访问。

内部访问:类中成员函数对其他成员的访问。

外部访问:通过类的对象,访问类的成员函数或者成员变量,有的书里也称之为对象访问。

这里的“水平”是自己为了容易理解而用的,其实也可以用“横向”这类的词,其他的词类似;词的叫法意义不大,但对加深理解却可以事半功倍!

private,public,protected单纯的作为一个类中的成员(变量和函数)权限设置时:

类的成员函数以及友元函数可以访问类中所有成员,但是在类外通过类的对象,就只能访问该类的共有成员。

注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数;这里将友元函数看成内部函数,方便记忆!

总结为下表:


类中属性


private


protected


public


内部可见性


可见


可见


可见


外部可见性


不可见


不可见


可见

程序验证如下:这里没有friend的成员,另外成员变量和成员函数的权限控制是一样的。

 1 #include <iostream>
 2
 3 class Foo
 4 {
 5 public:
 6     int a;
 7     void public_fun();
 8 protected:
 9     char b;
10     void protected_fun();
11 private:
12     bool c;
13     void private_fun();
14 };
15
16 //验证public成员内部可见性
17 void Foo::public_fun()
18 {
19     a = 10;
20     b = ‘c‘;
21     c = true;
22 }
23
24 //验证protected成员函数的内部可见性
25 void Foo::protected_fun()
26 {
27     a = 10;
28     b = ‘c‘;
29     c = true;
30 }
31
32 //验证private成员函数的内部可见性
33 void Foo::private_fun()
34 {
35     a = 10;
36     b = ‘c‘;
37     c = true;
38 }
39
40 int main()
41 {
42     Foo foo;
43     foo.public_fun();//验证public成员外部可见性
44     foo.protected_fun();//验证public成员外部可见性,这里提示错误
45     foo.private_fun();//验证private成员外部可见性,这里提示错误
46     return 0;
47 }  

3)C++的垂直访问控制

private,public,protected作为继承方式时:

派生类可以继承基类中除了构造函数与析构函数(凡是与具体对象的类别息息相关的都不能被继承,赋值运算符重载函数也不能被继承)之外的成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。


基类中属性


private


protected


public


private


protected


public


private


protected


public


继承方式


private


protected


public


内部可见性


不可见


private


private


不可见


protected


protected


不可见


protected


public


外部可见性


不可见


不可见


不可见


不可见


不可见


不可见


不可见


不可见


可见

派生类对基类成员的访问形式主要有以下两种:

(1)内部访问:由派生类中新增的成员函数对基类继承来的成员的访问。

(2)外部访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。

4) 有关权限控制的理解

C++的权限控制,给人感觉有点繁琐,特别是三种权限,再加上三种继承方式,还有友元那些东西,非常让人头大,这里总结一下,基本上把最常见和常用的给理清楚啦,一些这方面的问题,比如实际工作或者笔试题目,即可迎刃而解。

时间: 2024-10-23 09:59:56

C++成员权限控制(总结)的相关文章

Java成员的访问权限控制

Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以是public,protected, package private(无修饰符), or private. 以下表格总结了类成员中不同访问权限控制修饰符对应的访问级别:

译-BMC Remedy Action Request System权限控制概述

原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于ITIL标准的整个IT管理流程的实施定制.该平台可实现多种权限级别的管理,包括人员.组.角色,以及表.字段.行级别等.本文可以用作其他对权限要求比较精细的系统参考. 为了便于理解,部分名词翻译如下: Server:服务器Form (or table):表单Field (or column):字段Acti

php_ThinkPHP的RBAC(基于角色权限控制)详解

一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理. 在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收.角色与角色的关

Java访问权限控制

访问权限控制   java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.protected.包访问权限(没有关键字).private. 包:库单元 包内有一组类,它们在单一名字空间之下被组织在了一起.如果你向导入某个标准库中的类的话,可以使用import关键字.我们之所以要导入,就是要提供一个管理名字空间的机制.所有类成员的名称都是彼此分离的.所以具有相同方法的不同类在程序运行时不会出现错误的.

Java 访问权限控制:你真的了解 protected 关键字吗?

摘要: 在一个类的内部,其成员(包括成员变量和成员方法)能否被其他类所访问,取决于该成员的修饰词:而一个类能否被其他类所访问,取决于该类的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下,包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外).特别地,很多的介绍Java的书籍对protected介绍的比较笼统,常常会对大家造成误解.因此,本文重点揭示了 protected 关键字的内涵和用法,并介绍了一些其他

Java web自定义标签按钮级别权限控制完美诠释(jplogic 快速开发平台)

接下来跟大家聊聊JavaWeb中权限控制,往大的方向说可以聊聊整合应用系统中的权限控制.在聊权限控制之前先跟大家聊聊RBAC.那么什么是RBAC呢?RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联的,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的

Java 訪问权限控制:你真的了解 protected keyword吗?

摘要: 在一个类的内部,其成员(包含成员变量和成员方法)是否能被其它类所訪问,取决于该成员的修饰词:而一个类是否能被其它类所訪问,取决于该类的修饰词.Java的类成员訪问权限修饰词有四类:private,无(默认情况下.包訪问权限),protected 和 public,而当中仅仅有包訪问权限和public才干修饰一个类(内部类除外).特别地,非常多的介绍Java的书籍对protected介绍的比較笼统,经常会对大家造成误解. 因此,本文重点揭示了 protected 关键字的内涵和使用方法,并

为CDH 5.7集群添加Kerberos身份验证及Sentry权限控制

4. 为CDH 5集群添加Kerberos身份验证4.1 安装sentry1.点击"操作","添加服务":2.选择sentry,并"继续": 3.选择一组依赖关系 4.确认新服务的主机分配 5.配置存储数据库:在mysql中创建对应用户和数据库: mysql>create database sentry default character set utf8 collate utf8_general_ci; mysql>grant al

[转载] 使用Gitolite来对Git的repository实现权限控制

我们项目组打算从svn向git迁移,前几天我搭建了git环境,把代码从svn转移过来,然后所有成员都通过server上的git账号来做pull和push,一切都安置妥当,没有问题.但是后来其它项目组也打算使用这个git server,那么问题来了,之前那种授权的方式肯定是不够的,因为只要能连上server,那么他对这个server上所有的repository都有完全的读写权限,这显然是不可接受的. 所以打算使用Gitolite这个组件来做权限控制,搜索了下,找到的文章貌似都是老版本的,所以有了写