<!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if !mso]>
<object
classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui>
</object>
<mce:style><!--
st1/:*{behavior:url(#ieooui) }
-->
<!-- [endif]-->
<!-- [if gte mso 10]>
<mce:style><!--
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
-->
<!-- [endif]-->
[C/C++ Digestion] –
初始化列表与成员函参作用域
作者:
Jason Lee @
http://blog.csdn.net/jasonblog
日期:
2010-04-11
[1]
初始化列表
所谓初始化列表,从语法角度讲,就是构造函数圆括号后的冒号与左花括号之间的紧跟初始值的变量序列,如下是一个示例:
作为初始化列表,它以它的作用和初始化顺序而出名。
初始化列表有什么作用呢?我觉得可以一言以蔽之:初始化列表最重要的作用就是用来初始化不能被赋值的成员。比如引用必须在第一次出现的时候进行初始化,之后就不能再被赋值了。另外两种需要使用初始化列表的是被
const
修饰的类成员以及对象,而后者使用初始化列表进行初始化的主要原因方便和性能上的提高。
虽然初始化列表是一个有序的待初始化的变量序列,但真正对变量进行初始化的顺序却并不是如同初始化列表中所标明的一样,比如在如下代码中,是先使用
b
(未知数值)初始化
a
,然后再用数值
2
初始化
b
:
这是由于在类成员的声明次序中
a
先于
b
声明。
进一步反问:
a
先于
b
声明会导致什么呢?
在词法分析的过程中,当分析出一个新的变量时,需要向符号表进行该变量的信息注册。在上述代码中,
a
先于
b
声明,所以
a
先于
b
被注册到符号表中。以
Demo
类为例,该类仅有两个数据成员,并且在该类的符号表中成员
a
是在成员
b
之前。那么当我们要实例化一个对象(比如
demo
)的时候,需要分配一定的内存空间,这时应该思考一下,如果是自己设计会如何进行内存的分配呢?我想,一种合理的方案是根据符号表中各项记录的信息由上及下进行空间的申请与分配,于是
a
先于
b
获得了内存空间,那么自然
a
要先被初始化。
以上只是一种个人猜想的解释。另外一种权威的解释是说为了保证析构函数进行对象消亡处理的效率,必须保证有序性,因为无序性会带来昂贵的开销。所以构造函数与析构函数对成员的调用是相反的。
但是如何保证有序呢?我个人觉得对符号表(或者类似机制)的依赖是不可少的,或许,有点殊途同归?
[2]
成员函参作用域
在类定义体外定义函数,必须指明相关作用域,比如
。
看下面一段代码:
值得注意的是
func
函数后面的形参
arg
是
index
类型,该类型在
Demo
类中定义,这里无需特指该类型的定义域。而对于
func2
函数的返回值,该返回值是一个
index
类型,如果没有指定作用域的话则会出错。
这是为什么呢?
以下是个人的理解:
函数具有函数作用域,类也具有类作用域,这种局部作用域是如何体现出来的呢?我想一种可能的方案是采用局部的符号表,而全局作用域则对应着全局符号表。我们都知道,当进入某个函数,相应地就进入到该函数的局部作用域,一个比较常见的例子就是当前的局部变量会覆盖掉同名的全局变量。
假设当前采用的是符号表的机制,从全局进入某个局部作用域后,当前符号表从全局切换到某个局部符号表。所以当我们在类定义体外定义的成员函数时,首先指明了类作用域,再进入类的成员函数,这时候符号表就切换成与
Demo
类的符号表,从而即可访问
index
类型,因为该类型在声明的时候已经注册到当前的符号表中。
而对于返回类型为
index
的函数
func2
来讲,由于返回类型是出现在类成员函数之前,所以如果在类定义体外定义,当前处于符号表,并无该类型的注册信息,无法查找到,于是就需要指明相关类作用域。
再稍微涉及一点,如果把原语句改动一下:
则该函数是在全局中定义的一个函数,而非类的成员函数。这是因为指明
index
所属域的时候并没有进行符号表的切换,所以接下来是将
func2
函数注册到当前符号表,也就是全局符号表中。这又是为什么呢?换位思考一下,只是访问某个符号表中某个变量的注册信息值得切换当前符号表吗?
分享到:
相关推荐
Optimization of trace elements using response surface methodology (RSM) for biogas production in dry anaerobic digestion,李红丽,曹霏霏,The effect of trace elements (Fe、Co and Ni) on mesophilic dry...
厨余和园林垃圾批式厌氧消化研究,刘广青,张瑞红,使用批式厌氧消化法在中温(35±2oC)和高温(50±2oC)的条件下确定厨余和园林垃圾的沼气和甲烷产量。反应物组成为厨余和园林垃圾各�
不同初始pH的微电流作用下污泥厌氧消化的动力学和微生物种群分析,袁海平,,针对传统污泥厌氧消化法技术存在污泥生物可降解性能低、设施占地大、停留时间长、产气率及产气量较低等缺点,本文通过采用微电流
基于宏基因组学的好氧活性污泥和厌氧消化污泥的种群结构比较,郭建华,彭永臻,好氧活性污泥和厌氧消化污泥对城市污水处理厂的正常运行中扮演核心作用,但其中微生物种群结构十分复杂。近年来对城市污水厂中的
污泥起始浓度及微生物种群对微电流刺激污泥厌氧消化效果的影响研究,袁海平,,针对传统污泥厌氧消化技术存在的污泥生物可降解性低、停留时间长、设施占地面积大、产气率低下等问题,本文通过采用微电流刺激作
Qt及Qt Quick开发实战精解Qt and Qt Quick Development Practical Digestion
数据消化点 一组Python代码,用于从API,下载等中提取数据。最终输出TBD,但可能涉及SQLite,JSON和TSV。 magic_cards.py从mtgjson.com文件创建报告,Magic Arena甲板导出Magic_games.py从Magic Arena的Player.log...
5.3.6 State-of-the-Art – Digestion Strategy Included 98 5.3.6.1 Multidimensional LC MS Approaches 98 5.4 Applications of MD-LC Separation in Proteomics – a Brief Survey 100 5.5 Sample Clean-Up: Ways...
PNS.BAFS+364.2023_Biogas+System+—+Specifications+—+Wet+Anaerobic+Digestion+Process.pdf
Microwave thermal pretreatment of sewage sludge,王伟,乔玮,Water could absorb microwave and ... Municipal wastewater treatment plant sewage sludge was used to be heated by microwave digestion rea
digestion 方法用于处理消息反馈结果 judge 方法用于告诉用户消息是否分发到该url中 Probe为探头,被安装在触发器上,针对不同的触发器有不同的探头,一个触发器可以有多种探头,但同时只能安装一个(如果分析实例...
stacks_data_extraction.sh从Stacks 2.3d中提取相关指标以优化参数denovo_pipeline.sh在优化的参数组合上运行denovo_map.pl,并准备用于谱系构建的数据M.musculus_insilico_digestion_parallel_SbfI_MseI.R运行参考...
Providing thorough and detailed coverage, the text equips students with a solid understanding of digestion, absorption, and metabolism of fat, protein, and carbohydrates. It covers the biochemistry ...
要使用REDigest,必须安装以下依赖项(对于python3,版本≥) tkinter(8.6) 生物巨蟒(1.77) 熊猫(1.1.1) Matplotlib(3.3.1)运行REDigest与virtualenv(推荐) 为了避免REDigest要求阻塞系统目录,建议将其...
我们当今世界面临的最大挑战是固体废物管理。 这成为许多发展中国家无法解决的问题。 在不影响环境的情况下,通过对废物进行有机分割,将固体废物转化为有价值的能源的一种方法称为厌氧消化法。...