博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 中的权限控制
阅读量:5226 次
发布时间:2019-06-14

本文共 2138 字,大约阅读时间需要 7 分钟。

  权限控制,指的是用户只能访问符合自己权限的资源,系统对用户进行权限控制以防止用户的误操作/恶意操作等。

  在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的童鞋们是个好办法吧 ~

转载于:https://www.cnblogs.com/haosola/p/3690025.html

你可能感兴趣的文章
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
Java中正则表达式的使用
查看>>
算法之搜索篇
查看>>
新的开始
查看>>
java Facade模式
查看>>
NYOJ 120校园网络(有向图的强连通分量)(Kosaraju算法)
查看>>
SpringAop与AspectJ
查看>>
Leetcode 226: Invert Binary Tree
查看>>
http站点转https站点教程
查看>>
解决miner.start() 返回null
查看>>
关于MFC中窗口的销毁
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>