📄 关键字static总结之一.htm
字号:
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 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; 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: 21pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">静态全局变量(对象)是指全局变量的基础上加上</SPAN><SPAN
lang=EN-US>static</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">修饰符,它同时具有文件作用域和静态生存期两种特性。具体来讲就是指只在定义它的源文件中可见而在其它源文件中不可见的变量(文件作用域)。它与全程变量的区别是</SPAN><SPAN
lang=EN-US>: </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">全程变量可以再说明为外部变量</SPAN><SPAN
lang=EN-US>(extern), </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">也就是指跨文件作用域,被其它源文件使用</SPAN><SPAN
lang=EN-US>, </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">而静态全程变量却不能再被说明为外部的</SPAN><SPAN
lang=EN-US>, </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">即只能被所在的源文件使用。</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: l1 level1 lfo2; 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; TEXT-INDENT: 21pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">静态函数一般来说相对较少用到普通函数若未加</SPAN><SPAN
lang=EN-US>static</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">修饰,
<DIV id=hqwdlrbebhjmrob>V中Bg\~c,h网I%d提p</DIV>具有跨文件作用域,若加</SPAN><SPAN
lang=EN-US>static</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">修饰,与静态全局变量相类似也具有文件作用域,一般函数本身的一个目标就是实现共用(不管是函数定义文件还是被作为</SPAN><SPAN
lang=EN-US>include</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">对象的文件),若在函数前加上</SPAN><SPAN
lang=EN-US>static</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">主使得函数只能在本文件中使用,其它文件不能使用,我们当然不想这样做啦</SPAN><SPAN
lang=EN-US
style="FONT-FAMILY: Wingdings; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN
style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">J</SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ''''Times New Roman''''; mso-hansi-font-family: ''''Times New Roman''''">,所以,在一般的代码中,很少函数静态函数(静态全局函数)不存在。</SPAN><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></FONT>
<P></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; 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>4.</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: 21pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">当在程序中这义静态变量(对象)时,那么对于这个类的所以对象都将只分配一个共享的存储单,简单的说,静态成员变量属于类范围,而不是具体的某个对象,相当于类范围内的全局变量(对象),当然也可以说是属于自身类型的所有对象,</SPAN><SPAN
style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">它的值是可以更新的。只要对静态成员变的值更新一次,所有对象存取者将是更新后的相同的值(多线程应该自行控制),这样可以提高时间效率。</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; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>静态成员变量(对象)以为类为名称空间,为了更好的实现信息隐藏,可以将它设置为<SPAN
lang=EN-US>private,然后通过函数进行存取(后面应用中将会详细讲到),程序对类静态数据成员的访问会被转换为类内部的惟一extern实体的直接操作(至于如何被转换,不同的编译器将会有不同的算法,要详细了解请参阅《Inside
C++ Object
Model》),正因为这样,所以在类的内部可以直接定义自身类型的static成员,而不会造成类定义的无限递归,而非静态的自身类型则不行,只能是自身类型的指针或引用,其实这跟类定义结束是到大括号后的分号为止是有关的,在此之前将无法确定类的大小,而自身类型的指针或引用的大小则是确定(一个指针的空间)。如下面代码:<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>class A{<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes"> </SPAN>//……<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes"> </SPAN>private:<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN
style="mso-spacerun: yes"> </SPAN>//……<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 36.75pt; mso-char-indent-count: 3.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>static A<SPAN style="mso-spacerun: yes">
</SPAN>a1;//ok,因为a1为静态成员对象。<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 73.5pt; mso-char-indent-count: 7.0"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>A<SPAN style="mso-spacerun: yes">
</SPAN>a2;//error此时不能确定A类型的大小。<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 73.5pt; mso-char-indent-count: 7.0"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>A* a3;//ok 此时能确定A*类型的大小,
<P
id=jvshbcslvoplokpc>I5eIF3N`Ab\H[管i{</P>一个指抽A类型的指针的大小<o:p></o:p></FONT></SPAN>
<P></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>A& a4;//ok 此时能确定A&类型的大小,一个指抽A类型的指针的大小<SPAN
style="mso-spacerun: yes">
</SPAN><o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><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: 21pt"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>与全局变量一样,静态成员变量也只能提供一次这义,类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以它的实初始化将不能被放在头文件中,而应该放入相就是类成员函数的实现文件中,也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。对于<SPAN
lang=EN-US>const类型的静态有序类型可以直接初始化,但其定义还要在类定义之外:<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><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: 10.5pt; mso-char-indent-count: 1.0"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-spacerun: yes"> </SPAN>class
print{<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-tab-count: 1">
</SPAN>private:<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3><SPAN style="mso-tab-count: 1">
</SPAN><SPAN style="mso-spacerun: yes">
</SPAN>static const int count =
10;//直接初始化<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 84pt; mso-char-indent-count: 8.0"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>string info[count];<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; mso-char-indent-count: 1.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: 15.75pt; mso-char-indent-count: 1.5"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT
size=3>const int print::count;//可以在头文件,
<DIV id=nluauugpebdlbbehti>AN供_xz件=PK8(t#~oEw</DIV><FONT
id=dhnraepovahwoag>AfcH{q4V教B"'$=V</FONT>也可以在实现文件,因为不会为常分配空间<o:p></o:p></FONT></SPAN>
<P></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; 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>5.</FONT><SPAN
style="FONT: 7pt ''''Times New Roman''''">
</SPAN></SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-siz
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -