1.变量的作用功能 Function of variables

整体上讲,变量分为存储服务两种类型。

前者如CPeople *p=new CPeople(),其特点是与客观对象一一对应,其数量一般较大,而且应与客观对象的生存期相同。

后者如COODBDatabase Db,其特点是为了完成某个功能出现,数量以能完成功能为限(经常是一个),生存期可以只是本功能的执行时间;不过为了方便,避免多次定义,往往可超过此周期。

因此,如果一个类需要被声明大量实例,那么不要在其中声明用于服务的成员变量(至少不要声明那些大的),用以下方法来调用服务:

  • 声明static的成员变量,使所有实例共用一个变量;
  • 在成员函数实现中声明所需的服务,不过如果服务是一个需要构造和析构的类,会引起速度下降;
  • 引用外部服务类的指针;

Variables can be divided mainly into two types: for storage and for service.

Sample for storage is CPeople *p=new CPeople(), its characteristic is that it is corresponding to a real object, and the amount of this type of variable maybe large, it exists as long as the real object need.

Sample for service is COODBDatabase Db, its characteristic is that it exists for only a function, the amount of this type of variable is decided by the function requirement and it lives only during the function; but for convenience and avoiding repeated definition, some can outlive the function.

So if a class will be instanced for a large number,

1.2 变量的作用域 Life area?? of variables

全局变量

大部分程序可以不用任何全局变量完成其功能,因此应当不使用全局变量。但在以下情况下,可方便且安全地使用全局变量:

①此变量类型只声明唯一的实例,并且生存期与进程相同:

  • 主窗口或主进程:如extern CFhtHostApp theApp; extern CFhtHostDlg *g_pDlg;其命名不需要很具体;
  • 全程唯一此类型的实例:如CMyCAHost *g_pMyCAHost; COODBDatabase COODBDatabase::m_DefaultOODBDatabase;

如果需要声明两个以上实例的,则按规范以g_开头,且命名要具体,以示区别。

②非VC++类的函数,且需要符合其特定参数的,可用全局变量进行传递:

  • Rpc的实现函数,如:

extern "C" boolean RpcSetHost(handle_t IDL_handle,int *pnSize,unsigned char *szCAHost)
    {
    ...
    g_CAConsole.SetHost(pCAHost); 
    ...
    }

  • 线程函数,如:

DWORD WINAPI CRpcServer::ServerThread(LPVOID pParam)
    {
    ...
    g_pServer->StopServer();
    ...
    }

注意,配合全局函数使用,可提高全局变量的稳定性。

CADPS系统中的::FhtLoadConfig()函数实际上调用了全局变量CCARegistry::g_CARegistry,使用全局函数屏蔽了全局变量,将此全局变量的应用局限在全局函数内部,因而只需此类的管理员保证此函数中的应用是安全的,对此函数的调用也都是安全的。

利用全局函数封装全局变量的好处与类的封装相似。在《设计模式》一书中提到的可复用面向对象编程的第一个原则就是:针对接口编程,而不是针对实现编程。这样在需要改变数据结构时,应用层的软件可以完全不改动。

将无谓的全局变量转换为其他变量,可提高系统稳定性。

类成员变量

类的成员变量用以存储类的数据、状态、外部数据或服务的地址。以下是一些关于成员变量应用适当和不当的场合:

①绝大部分用成员变量进行服务的场合都可以通过其他方法化解,从而使成员变量只有存储功能。

例如COODBRecord中的CTypedPtrArray <CObArray,COODBField*> m_FieldArray变量,尽管从自然对象中抽象时,每个记录都包含多个Field,而且数据也存储在Field中,但实际上在C++类中,数据是存储在其相应的变量中的,COODBField只在GetFieldValue()函数调用时用一次将数据库中的数据取出,然后用COODBField::DatabaseToClass()转换为C++数据类型,并将数据赋值给C++变量的地址,因而是服务型数据,所以后来将其取消,而在GetFieldValue()调用时生成一组(和列数相同)临时的数据,进行转换服务,将每次Select()操作时所需COODBField的数量从300000(20000Customers时)个减少到15个,将内存占用从107M减少到55M,还节约了运行时间。

实际上在上例中,只需要一个而非一组COODBField即可完成此工作,不过由于程序易读性比效率更优先,所以在影响不大的情况下(15个和1个内存占用差别不大),并不考虑优化效率的极端手段。

如果用于服务的数据很小,不适合单独在类的外部声明,则可以改为该服务函数中的一个临时变量。但有些数据的构造和销毁相当花费时间(如CString/CDBVariant等),这时候可考虑将此数据声明为类的static变量。相关内容

②绝大部分以上使用场合以外的全局变量,都可以被一个类成员变量以外部服务地址的方式取代。

在COODBQuery中有一个变量COODBCDMap *m_cpOODBCDMap,此数据存储了全局变量COODBCDMaps g_OODBCDMaps中与此类相对应的列与变量地址的映射信息,由于使用了一个变量来存储此映射信息的地址,并在COODBQuery调用m_cpOODBCDMap=::FhtOODBCDMapOf(aClass.CDMapName())来初始化此变量,而不是直接使用全局变量。因而因而在此后的操作中将不再需要用到全局变量,而只需要判断m_cpOODBCDMap的合法性即可。

类函数变量,全局函数变量

(略)

1.3 变量作用形态 State of variables

静态变量

因为在程序运行时只使用同一个实例,因而可以节约其构造器和销毁器的运行时间,对海量运算节约时间有益。常见的构造器和销毁器缓慢的类包括CString,COle系列类等。要特别注意的是静态变量的声明初始化如static int nCount=0;只进行一次,因此这种应用中要特别注意清除上次的参数数据或避免其影响。

静态变量的一种常见应用是用来记录上次运行时的数据,不过从经验来看,如果是在类的函数中,应直接声明此数据为类的变量可使应用更加易于理解和控制。

变量的作用功能、作用域和作用形态相关推荐

  1. Python:闭包(简介、使用方法、nonlocal修改闭包内使用的外部变量)、装饰器(定义、作用、通用装饰器、多个装饰器、带参数的装饰器、类装饰器、装饰器方式添加WEB框架的路由)

    一.闭包的介绍 闭包可以保存函数内的变量 当闭包执行完毕,外部函数的变量才释放. # 闭包的作用:可以保存外部函数的变量 # 闭包的形成条件 # 1.函数嵌套 # 2.内部函数使用了外部函数的变量或者 ...

  2. java的环境变量classpath中加点号 ‘.’ 的作用

    java的环境变量classpath中加点号 '.' 的作用 "."表示当前目录,就是编译或者执行程序时,你的.class文件所在的目录: 当找.class文件时,先去" ...

  3. 畅享10e会有鸿蒙吗,功能虽小作用很大 华为畅享10e隐藏功能大揭秘

    原标题:功能虽小作用很大 华为畅享10e隐藏功能大揭秘 如今使用手机游戏.观影.听音乐.刷短视频.拍照等多种多样的娱乐方式,充斥着年轻人生活之中.作为年轻用户娱乐的重要载体,现在的手机不仅硬件强大,在 ...

  4. Android 系统(228)---NITZ网络自动对时功能不起作用

    NITZ网络自动对时功能不起作用 在手机选项中开启了自动更新时间/日期,但是时间日期并没有自动更新 Root Cause 1. 网络不支持NITZ功能 2. NITZ信息在PS域(GPRS/EDGE) ...

  5. 企鲸客scrm 渠道活码功能介绍及作用

    企鲸客scrm 渠道活码功能介绍及作用 今天简单跟大家介绍一下企鲸客scrm渠道码的功能以及作用. 企鲸客scrm渠道码介绍,可添加多个员工的企业微信码生成渠道活码,当有人扫码时候随机展示不同员工的的 ...

  6. 资产管理系统有哪些功能模块和作用

    通过固定资产管理系统对固定资产进行合理管理,提高了管理水平,提高了工作效率,提高了企事业单位的经济效益.资产管理系统V2.0网络精英版适合于3-5人的中小型公司.集团公司某个部门如办公室及仓库.中小学 ...

  7. 计算机中的CNC键代表什么,国内数控(CNC)机床操作面板按键及功能组合键作用(全套)对照...

    常见数控(CNC)机加按键.组合功能 1.进入控制系统:通过点击屏幕最右下角的功能键(next键)并同时按下靠左侧的电源键 2.屏保待机:如果需要很长加工周期并无需任何额外操作时,可以通过同时按下CA ...

  8. 服务器个人买能干什么_动态vps是干什么用的?拨号VPS的作用功能是什么?

    动态VPS,我们也叫他拨号VPS,只是称呼不一样而已.下面我们来看看动态vps是干什么用的?拨号VPS的作用功能是什么? 一.互联网营销类 不论是个人还是企业对于互联网营销,ip切换工具是必备的,在常 ...

  9. 阿里云安骑士免费基础版和付费企业版功能区别及作用

    阿里云为每台ECS云服务器配备了免费基础版的安骑士,如果想获取更多功能,用户可以升级到付费的企业版,那么安骑士基础版和企业版有哪些区别?值不值得付费购买企业版安骑士呢?阿里云百科网帮大家对比下: 详细 ...

最新文章

  1. MySQL · 性能优化· CloudDBA SQL优化建议之统计信息获取
  2. 人工智能、机器学习、深度学习和神经网络的区别
  3. 武汉计算机985211大学有哪些,武汉985211大学有哪些 武汉985211大学有什么
  4. 30秒的PHP代码片段-MATH
  5. php只能用浏览器触发吗,PHP只允许某个域名或者URL访问调用不允许浏览器直接执行的方法...
  6. phoneGap工程的创建
  7. 关于ssd-tensorlow如何训练自己的数据集合
  8. 开源地图引擎openlayers_由quot;地图quot;到quot;指南针quot;:疫后智能营销的演化逻辑...
  9. 高效沟通的方法和工具
  10. ps里文字变形、、、
  11. 社会统计分析—基础知识
  12. 新库上线 | CnOpenData制造业工商注册企业基础信息数据
  13. python红色的颜色表达式_python – 排序(十六进制)颜色以匹配彩虹
  14. 主干开发 主干发布_通过基于主干的开发来改善发布过程
  15. 请仔细品味--俞敏洪励志演讲
  16. 【达内课程】异常Exception(上)
  17. 【周志华机器学习】九、聚类
  18. cisco asa(asa5510 设置)防火墙的配置详解
  19. android---多点触控
  20. 初识C语言_(完结)

热门文章

  1. xmms安装和中文设置
  2. UE4纯蓝图-生存开发游戏
  3. linux账号密码输入没反应,linux 主机上出现输入正确的账号和密码,无法登陆,如何操作...
  4. 外网访问arm嵌入式linux系统_嵌入式Linux系统移植的四大步骤
  5. 下个月去北京了,心如一团乱麻好多事情要解决,但是不知道从哪里开始,还是顺其自然吧,一件件的解决...
  6. java给Excel表格赋值_Java 实现 给Excel模板赋值(直接打开表格赋值或者用自定义了名称的单元格(一块区域)赋值)...
  7. Ray+GPU支持高性能计算
  8. Redis从阿里云迁移至华为云
  9. 详解scp文件传输(使用ssh服务,无须反复输入密码)(可用于服务器和本地电脑的文件传输)
  10. git提交用户名与当前用户名不止一致(或者邮箱)