C++成员权限控制(总结)
1) 前言
在我学习C++的过程中,类中成员的权限控制一直是比较头疼的一个点,一会public,一会又private,还有protected,再加点继承,而且又有公有继承、私有继承,保护继承,所以感觉会比较乱。
后来不断学习过程中,慢慢理顺了它们的关系,稍微分类总结一下,在这个问题上基本上就没再栽过跟头。如有笔误,希望大神指点一下!
2 )C++的水平权限控制
首先解释几个特定词,下面要用到:
水平权限:在一个类中,成员的权限控制,就是类中的成员函数能否访问其他成员、类的对象能否访问类中某成员。
垂直权限:在派生类中,对从基类继承来的成员的访问。
内部访问:类中成员函数对其他成员的访问。
外部访问:通过类的对象,访问类的成员函数或者成员变量,有的书里也称之为对象访问。
这里的“水平”是自己为了容易理解而用的,其实也可以用“横向”这类的词,其他的词类似;词的叫法意义不大,但对加深理解却可以事半功倍!
当private,public,protected单纯的作为一个类中的成员(变量和函数)权限设置时:
类的成员函数以及友元函数可以访问类中所有成员,但是在类外通过类的对象,就只能访问该类的共有成员。
注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数;这里将友元函数看成内部函数,方便记忆!
总结为下表:
类中属性 |
private |
protected |
public |
内部可见性 |
可见 |
可见 |
可见 |
外部可见性 |
不可见 |
不可见 |
可见 |
程序验证如下:这里没有friend的成员,另外成员变量和成员函数的权限控制是一样的。
#include <iostream> class Foo
{
public:
int a;
void public_fun();
protected:
char b;
void protected_fun();
private:
bool c;
void private_fun();
}; //验证public成员内部可见性
void Foo::public_fun()
{
a = ;
b = 'c';
c = true;
} //验证protected成员函数的内部可见性
void Foo::protected_fun()
{
a = ;
b = 'c';
c = true;
} //验证private成员函数的内部可见性
void Foo::private_fun()
{
a = ;
b = 'c';
c = true;
} int main()
{
Foo foo;
foo.public_fun();//验证public成员外部可见性
foo.protected_fun();//验证protected成员外部可见性,这里提示错误
foo.private_fun();//验证private成员外部可见性,这里提示错误
return ;
}
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++的权限控制,给人感觉有点繁琐,特别是三种权限,再加上三种继承方式,还有友元那些东西,非常让人头大,这里总结一下,基本上把最常见和常用的给理清楚啦,一些这方面的问题,比如实际工作或者笔试题目,即可迎刃而解。
C++成员权限控制(总结)的更多相关文章
- Java成员的访问权限控制
Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...
- java基础-类成员访问权限控制
一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- JAVA访问权限控制[zhuan]
Java的访问权限控制修饰符,从最大权限到最小权限依次是:public.protected.包访问权限(默认,没有关键字)和private.对于类的访问权限只能是:public和包访问权限(但内部类可 ...
- 为CDH 5.7集群添加Kerberos身份验证及Sentry权限控制
转载请注明出处:http://www.cnblogs.com/xiaodf/ 4. 为CDH 5集群添加Kerberos身份验证 4.1 安装sentry1.点击“操作”,“添加服务”:2.选择sen ...
- Sql Server来龙去脉系列 必须知道的权限控制核心篇
最近写了<Sql Server来龙去脉系列 必须知道的权限控制基础篇>,感觉反响比较大.这可能也说明了很多程序猿对数据库权限控制方面比较感兴趣,或者某些技术点了解的没有很透彻. 有些人看 ...
- db2权限控制(转)
转自:http://gocom.primeton.com/blog16274_23254.htm db2权限控制 1. DB2 权限控制数据库安全性计划的以下几方面: 授予用户的权限级别 允许用户运行 ...
随机推荐
- Java递归实现操作系统文件的复制、粘贴和删除功能
通过Java IO递归实现操作系统对文件的复制.粘贴和删除功能,剪切=复制+粘贴+删除 代码示例: import java.io.BufferedInputStream; import java.io ...
- Jquery DataTables相关示例
一.Jquery-DataTables DataTables 是jquery的一个开源的插件.它具有高度灵活的特性,基于渐进增强的基础,可以为任何表格添加交互.它特性如下: 提供分页,搜索和多列排序: ...
- 记一次linux服务器问题处理过程
本周二的时候,涛哥找我,说明了一件事,在安装ganglia的时候,发生的一个问题. 在一台suse 10 sp1的服务器上,安装ganglia的一个依赖包,libconfuse.rpm,安装完成之后, ...
- SSIS XML source demo
以下是一个使用xml作为source的SSIS package示例: 自动生成的xsd.把两个结点merge join成一条记录. 示例XML如下: <?xml version="1. ...
- 《TCP/IP 详解 卷一》读书笔记 -----第四章 ARP
1.一个物理层的网络,例如以太网,可以同时被多个不同的网络层所使用.例如网络中的一些主机使用TCP/IP协议,其他主机使用其他的网络协议. 2.设备驱动软件从不关心IP数据报中的目的IP地址.这也是为 ...
- 原创翻译-测试驱动开发(TDD)
测试驱动开发原则 翻译自<<Expert Python Programming>> 测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件.也就是说,在编写软件 ...
- POJ 1195 Mobile Phones
树状数组,开始的时候wa了,后来看看,原来是概率论没学好,以为求(L,B) - (R,T) 矩阵内的和只要用sum(R+1,T+1) - sum(L,B) 就行了,.傻x了.. 必须 sum(R,T) ...
- 栈和队列的面试题Java实现【重要】
栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...
- MySQL数据库学习笔记(三)----基本的SQL语句
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Jenkins遇到问题一:jenkins配置权限不对导致无法登陆或者空白页面解决办法
找到.jenkins/config.xml文件:替换为:1.<authorizationStrategy class="hudson.security.AuthorizationStr ...