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 ...
- SqlBulkCopy块拷贝数据时,不履行触发器和束缚 解决办法
在new SqlBulkCopy时,设置SqlBulkCopyOptions属性即可 SqlBulkCopy bulkCopy = new SqlBulkCopy(ConStr,SqlBulkCopy ...
- Android开发之 Android应用程序详细解析
我们继续的沿用上一篇所建立的应用. Android应用程序可以分为:应用程序源代码(.java),应用程序描述文件(.xml),各种资源. 可以这么理解: 安卓应用程序,通过java代码来实现其业务逻 ...
- 烂泥:centos6.4服务器添加新硬盘
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 公司FTP服务器的空间又不够了,唉,没有办法只能新加硬盘了.因为以前没有给Linux服务器添加过硬盘,所以只能先在虚拟机中进行模拟. 新加硬盘的操作步骤 ...
- jenkins 更换主数据目录
工作中,由于Jenkins默认的主目录空间太小,导致需要将Jenkins默认的主目录修改到其它目录.本文针对更改Jenkins的主目录详细介绍. 注意:在Jenkins运行时是不能更改的. 请先将Je ...
- 解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题
关键点:- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizati ...
- linux文件压缩与打包
在linux中常见的压缩命令 首先,在linux中压缩文件的扩展名大多是 *.gz gzip程序压缩的文件 *.bz2 bzip2程序压缩的文件 *.tar tar程序打包的数据,并没有压缩过 *.t ...
- ubuntu更新删除旧内核的shell脚本
ubuntu经常提示要更新内核,更新几次后 /boot目录就满了,再更新就提示目录没空间了,这时候就需要删除不用的老旧内核,之前都是uname, grep, dpkg之类的命令一条条敲,然后用眼睛看需 ...
- WCF宿主端检验队列
ServiceHost host = new ServiceHost(typeof(Service1)); if (MessageQueue.Exists(@".\private\MyMes ...
- Regarding learning
when you learn something, just like learn computer language. if you just learn some basic usage, not ...