C++ 中的权限控制
权限控制,指的是用户只能访问符合自己权限的资源,系统对用户进行权限控制以防止用户的误操作/恶意操作等。
在C++代码中,权限控制指的是程序员在接口声明/类声明/函数声明等中进行的授权控制。如下面的代码:
复制代码
class base
{
//friend 授权getX函数对本类的完全控制
friend int getX(base obj);
//public 授权外部对此类中被声明为public的函数,类成员的访问与修改
public:
//后置的const 禁止此函数对本类的任何修改
virtual void show() const
{
cout《"hello from base"《endl;
}
//protected 仅授权子类对此类中被声明为protected的函数,类成员的访问与修改
protected:托福答案
//参数中的const 禁止此函数对传入参数的任何修改
//后置的const 禁止此函数对本类的任何修改
int getSum(const int x,const int y) const
{
return x+y;
}
//private 禁止对此类中被声明为private的函数,类成员的访问与修改
private:
int m_x;
};
int getX(base obj)
{
return obj.m_x;
}
//public 表示继承关系对外可见,外部可将此类视作base类型
class derived : public base
{
public:
virtual void show() const
{
cout《"hello from derived"《endl;
}
private:
int m_Y;
}
复制代码
c++11中新增的的lambda函数中也有权限控制相关的部分,如下代码:
复制代码
void foo(int x)
{
int y = 0;
//[&]授权对此处所有可见变量进行完全控制
auto lambda_func1 = [&](){x+=1;y-=1;};
//[=]仅授权对此处所有可见变量进行读取
auto lambda_func2 = [=](){int z = x+y;};
//[=x,&y]仅授权对此处所x进行读取,对y进行读取/修改
auto lambda_func3 = [=x,&y](){int z = x+y;y++;};
}
复制代码雅思答案
权限控制是个好东西,能够让我们最小化自己的权限以防任何的误操作,同时也能更清晰的进行编码debug,查找bug时能迅速定位相关函数代码。
如果在c++中的全局函数中,类成员函数生命中确定更详细的权限控制,并且权限进行继承,不加权限控制符则默认与传统C++代码一致,如下代码:
复制代码
//global var
const int g_nVar = 0;
//class
//禁止访问任何外部变量
[NA] class base
{
//授权getX仅能读取本类的m_x变量
[=m_x] friend int getX(base obj);
public:
//此函数禁止访问本类中任何变量
[NA] int getConstant() const
{
return 10;
}
//授权此函数访问/修改m_x
[&m_x] int modifiedX()
{
return ++m_x;
}
//授权此函数可读取本类中所有变量
[=] void show() const
{
cout《"hello from base , m_x = "《m_x《endl;
}
private:
int m_x;
};
[=] int getX(base obj)
{
return obj.m_x;
}
//禁止访问任何外部变量
[NA] void foo(int x)
{
int y = 0;
//[&]授权对此处所有可见变量进行完全控制
auto lambda_func1 = [&](){x+=1;y-=1;};
//[=]仅授权对此处所有可见变量进行读取
auto lambda_func2 = [=](){int z = x+y;};
//[=x,&y]仅授权对此处所x进行读取,对y进行读取/修改
auto lambda_func3 = [=x,&y](){int z = x+y;y++;};
}
复制代码
估计对于那些受够了由于在类的不知道哪个犄角旮旯里修改了某些成员变量,全局变量的bug的童鞋们是个好办法吧 ~
C++ 中的权限控制的更多相关文章
- <实训|第九天>掌握linux中普通的权限控制和三种特殊的权限(sst),做合格的运维工程师
linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经 ...
- django中的权限控制(form增删改)
Django默认提供了权限控制,但只能对使用了其自带的登录认证的用户进行权限控制,说白了就是只能对存储在auth_user表中的用户进行权限控制,但不能对未登录过的用户进行权限控制.但如果通过集成LD ...
- vue基于页面中按钮权限控制
main.js // 权限 /** 权限指令,对按钮权限的控制 **/ Vue.directive('allow', { bind: function(el, binding) { // 通过当前按钮 ...
- 如何优雅的在 vue 中添加权限控制
前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为 ...
- 如何在 vue 中添加权限控制管理?---vue中文社区
前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为 ...
- <实训|第十三天>linux中ACL权限控制以及磁盘配额,附编译属于自己的linux内核
[root@localhost~]#序言 首先讲讲昨天关于缩容失败,开不机的解决方法:ACL权限也算是一个很重要的知识点,不难,但是很实用:磁盘配额一般不需要自己弄,但是要懂得原理.剩下的就是编译属于 ...
- 基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...
- SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...
- SAP CRM Transaction处理中的权限控制
当试图打开一个Opportunity时, 系统会进行如下一系列的权限检查: 1. 检查Authorization object CRM_ORD_OP: 此处会检查当前user的partner func ...
随机推荐
- Spring框架整合Struts2
1,用Spring架构,及Struts2-spring-plugin插件 导入Spring的dist全部所需的jar包 Struts2的spring插件 struts2-spring-plugin.X ...
- C语言调用汇编实现字符串对换
1. 前面配置arm交叉编译环境. 2. 配置好qemu-arm C语言代码string-switch.c: #include <stdio.h> #include <stdlib. ...
- Yii框架tips
db组件 'schemaCachingDuration'=>3600, 为什么不起做用?需要开缓存 如何在页面下边显示sql的查询时间在log组件的routes中加入 array('class' ...
- mysql数据库引擎问题汇总
可以使用mysql> show engines;查看mysql支持何种引擎, 其中default表明该引擎为默认引擎. 在windows下面的mysql引擎默认为InnoDB,linux下的为 ...
- NuGet的使用和服务搭建
问题的由来 最近部门,在开发的时候遇到一个问题,现在有项目A B C三个项目,项目B和C分别提供了组件库由项目A直接引用.那么每次开打项目A获取最新后,同时还得打开项目B C获取最新然后编译一次.抛开 ...
- linux route命令学习
route命令用于显示和操作IP路由表. 没有增加路由之前,route命令的结果如下, sh-# route Kernel IP routing table Destination Gatew ...
- WCF - 学习总目录
WCF - 基础 WCF - 地址 WCF - 绑定 WCF - 绑定后续之自定义绑定 WCF - 契约 WCF - 序列化 WCF - 消息 WCF - 实例与会话 WCF - REST服务
- Chapter 3 - How to Move a sprite
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=250529 http://www.cocos2d-x.org/boards/6/ ...
- C++中各种数据量类型转换
要在Unicode字符集环境下把CString转化为char* 方法: CString str = _T("D://校内项目//QQ.bmp");//////leo这个NB 可以 ...
- C语言 打印圣诞树
再回首<C语言编程基础>,其中不少当年老师出的题,做完后稍微做了下修改,可以输入任意行数来打印圣诞树,行数越大,树越大,当然显示器也要越大,不然就折行了. 纯粹练手跟加强记忆的东西,做个记 ...