C++关键字static

 

     本文主要讲解C++ static关键字使用时的一些技巧,需要避免的用法。

    一、基本语法

            static的变量存在于全局静态数据区,系统自动初始化为0。在整个程序运行过程中只初始化一次,只有一个内存地址。具体还有一些细节,想必大家已经在其他书籍上看过了,这里不再多提。

 

    二、使用技巧

            1、在不增加其他变量的情况下,优化程序。

                 先看如下代码,假设我们使用这个函数计算最大整数的大小:

                

 

                如果计算多次的话,我们的代码可能是这样的:

                

                这样实际上MaxInt函数运行了两次,我们可以肯定的是,一个程序在运行期间,最大整数大小不会变化,所以这里计算两次显得多余了。

 

               一般情况下,我们当然不会犯如此低级的错误,我们一般会如此写代码:

                  

               从运行结果来看,效率上去了,并没有计算两次,但为了如此功能添加一个全局变量显然不合适,如果以后还要添加诸如:最大文件链接数量,当前程序最大栈大小……,那程序的可读性就不那么好了。

 

              在此情况下,我们可以使用static变量避免此问题:

             

              从这段代码来看,不仅没有多余的全局变量,程序的效率也得到了改善,是比较好的做法。

 

              说到这里当然还有更好的设计方案,将函数MaxInt()做为classprivate函数,GetMaxInt()做为classpublic函数,则是更好的设计方案。

 

            2、使用static class function代替namespace function

              根据上面的设计,我们将function写到class

                

 

              然后使用之

             

              到此为止一切都非常好,使用两行代码就完成了功能,但有没更佳的方案呢?有,下面代码只需一行。

              我们使用namespcae代替class

              

              一行代码就完成了功能,但你看出上述代码的缺陷了吗?万一某个初学者直接使用MyMaxInt::MaxInt(),那怎么办,晕,又回到以前老路上面去了。

 

             下面给出最终设计,全面解决此问题,我们用static class function代替之前的设计

            

 

             现在只需使用CMyMaxInt::GetMaxInt就可以了,并且直接声明类的对象会标记为编译错误。

 

 

    三、需要避免的用法。

           1、不要滥用static

            我们假设有个名为People的类,其中有个字符数组szName,最一般的初始化会写成这个样子。

           

            当然某些童鞋可能闲多调一个memset麻烦,于是写成如下形式:

             

           从表面看,都初始化为0了,但如果再声明一个People对象,其szBuf却不为0,此处尤其需要小心,请记住,static只在必要的时候采用,千万不要为了不想手动初始化而滥用。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章