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 权限控制数据库安全性计划的以下几方面: 授予用户的权限级别 允许用户运行 ...
随机推荐
- UC 浏览器远程调试手机web网页记录
浏览器远程调试插件有很多,本来要使用chrome浏览器的调试插件的,但是需要FQ才能使用(公司网络有限制,果断放弃),最终选择使用UC浏览器的. 其实UC官网插件使用已经介绍的很详细了,但是有几处坑需 ...
- mysql忘记密码的重置方法
1. 编辑mysql主配置文件 my.cnfvim /etc/my.cnf在[mysqld]字段下的位置添加参数skip-grant保存退出2. 重启数据库服务service mysqld resta ...
- FileInputFormat
MapReduce框架要处理数据的文件类型 FileInputFormat这个类决定. TextInputFormat是框架默认的文件类型,可以处理Text文件类型,如果你要处理的文件类型不是Text ...
- ubuntu apache2服务器配置
把django开发好的项目部署到apache2服务器. 记录我的配置过程. apache,django,mod_wsgi,python版本如下.不同版本大同小异. ii apache2 2.2.22- ...
- [转]ionic项目之上传下载数据
本文转自:http://blog.csdn.net/superjunjin/article/details/44158567 一,首先是上传数据 记得在angularjs的controller中注入$ ...
- $.ajax()方法详解及实例
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- Unity 2D Sprite Lighting
2D游戏中也可以使用灯光?这真是一个好消息,接下来,我将为大家写一下教程 操作步骤 1.创建一个Materilas,修改Shader为 2.创建一个Sprite(使用黑色的图片) 3.创建一个Poin ...
- linux命令学习-复制(cp,scp)
linux为我们提供了两个用于文件的copy的命令,一个是cp,一个是scp.但是它们略有不同: cp主要用于在同一台电脑上,在不同的目录之间来回copy文件,scp主要是在不同的linux系统之间来 ...
- java 8-5 抽象
1. 抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类. 抽象类的特点: A:抽 ...
- php file_get_contents 绕过
http://www.shiyanbar.com/ctf/1837 想到了经常出现的残留文件问题,于是尝试了一下:index.php~,index.php.bak, $flag='xxx';extra ...