📄 关键字static总结之二.htm
字号:
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><SPAN lang=EN-US
style="FONT-FAMILY: 新宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-hansi-font-family: ''''Times New Roman''''"><FONT
size=3><SPAN style="mso-tab-count: 1">
</SPAN>m_hIcon =
AfxGetApp()->LoadIcon(IDR_MAINFRAME);<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 新宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-hansi-font-family: ''''Times New Roman''''"><FONT
size=3>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>//……<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>////////////////////////////////////////////////////////////////////////////<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; tab-stops: right 415.3pt"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>上面这种直接初始并使用的功能是借助<SPAN
lang=EN-US>menu来实现的。但这有个不好之处就是使menu在这里丧失了本来的作用(menu本身的功能没有得到体现)但有了static之后可以在一个类中使用static常量来达到同样的效果,因为一个类的静态常量被当作一个编译时的常量,而又因为静态具有文件作用域的内部连接,所以不会产生重复定义的冲突。其代码示例在介绍静态成员变量(对象)时已经给出。<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; tab-stops: right 415.3pt"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-spacerun: yes">
</SPAN>不知道大家有不有注意,menu只能使用整型,但类内部静态常量可以是任何类型,甚至抱用户自定义类型。<SPAN
style="mso-tab-count: 1"> </SPAN><o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><SPAN
style="mso-list: Ignore"><FONT size=3>2.</FONT><SPAN
style="FONT: 7pt ''''Times New Roman''''">
</SPAN></SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>单件模式<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>相大家都知道单件模式吧,如果不熟悉可以参考相产模式的书籍,单件模式保证一个类仅有一个实例存在<SPAN
lang=EN-US>,具体就是通过静态成员变量和静态成员函数以及类的访问层次相结合而实现的,具体代码如下:<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>//////////////////////////////////////////////////////////////////////////<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>class Singleton{<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>public:<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes">
</SPAN>static Singleton*
Instance();//注:静态成员函数返回类的实例<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes">
</SPAN>virtual ~Singleton(){};<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>protected:<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes">
</SPAN>Singleton(){};<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>private:<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes">
</SPAN>static Singleton*
_instance;//注:静态成员变量指向类的实例<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>};<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>//实现文件:<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>Singleton* Singleton::_instance =
0;//静态成员变量的初始化<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>Singleton* Singleton::Instance()<SPAN
style="mso-spacerun: yes">
</SPAN>//返回指向类实例的静态指针<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>{<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-spacerun: yes"> </SPAN>if(_instance ==
0)<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes">
</SPAN>_instance = new Singleton;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-spacerun: yes"> </SPAN>return
_instance;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>/////////////////////////////////////////////////////////////////////<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>静态成员函数加静态成员变量便可实现单件模式,<FONT
id=tfmmjoecwilnls>crE8YxFf(XS@-络</FONT>其中静态成员函数控制返回类的实例,因为静态成员函数不能为虚函数,因此子类就不能多态的对它进行重定义,这就保证了只能过此接口对类进行使用。用静态成员变量指向那个唯一被实例化的对象,当然最实始被初始化为<SPAN
lang=EN-US>0,然后使用惰性初始化时行实例的建立,<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">如果将这些换成全局静态对象和全局静态函数,相信会有不少问题存在</SPAN><SPAN
lang=EN-US
style="FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 宋体; mso-ascii-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN
style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">J</SPAN></SPAN><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><SPAN
style="mso-list: Ignore"><FONT size=3>3.</FONT><SPAN
style="FONT: 7pt ''''Times New Roman''''">
</SPAN></SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>消除全局数据<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>大家都知道,大家都知道,引入全局数据确实在适当的时候能解决一些棘手的问题,但全局数据是跨文件作用域,使得变量的正确初始在有些情况下非常难控制(后面第<SPAN
lang=EN-US>4点将会讲到),全局变量一旦建立,要消除它是相当难,随着而来便是”名字空间污染”问题,不仅如此,全局变量将变量(对象)和算法代码绑定在一起,使得复用又相当困难。<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-tab-count: 1">
</SPAN>对于全局变量所存在的这些问题,可以使用封装加静态访问的方法使问题得到优化<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>首先将全局变量放入一个类或结构中<SPAN
lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>然后将它们私有化并添加静态成员函数访问接口<SPAN
lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>例如有下面的全局变量<SPAN
lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-spacerun: yes">
</SPAN>bool g_flag;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -