zoukankan      html  css  js  c++  java
  • 转载的关于c++ static的定义

    static:静态修饰符,被static修饰的变量和方法类似于全局变量和全局方法,可以在不创建对象时调用,当然也可以在创建对象之后调用。常见的可以用于工具类的工具方法中等,譬如:Math类中的绝大多数方法都是静态方法,他们扮演了工具方法的作用。

    1.第一条也是最重要的一条:隐藏。(static函数,static变量均可)

    所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

    2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

    存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见

    PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

    #include <stdio.h>
     
    int fun(){
        static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
        return count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:    
     
    }
     
    int count = 1;
     
    int main(void)
    {
         printf("global		local static
    ");
         for(; count <= 10; ++count)
                   printf("%d		%d
    ", count, fun());
         return 0;
    }

    3.static的第三个作用是默认初始化为0(static变量)

    其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘’;太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是‘’;不妨做个小实验验证一下。

    #include <stdio.h>
     
    int a;
     
    int main()
    {
         int i;
         static char str[10];
         printf("integer: %d; string: (begin)%s(end)", a, str);
         return 0;
    }

    4.static的第四个作用:C++中的类成员声明static(有些地方与以上作用重叠)

     在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:

    (1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。      

    (2)不能将静态成员函数定义为虚函数。      

    (3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。

    (4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就 产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X W indow系统结合,同时也成功的应用于线程函数身上。 (这条没遇见过)  

    (5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。      

    (6)静态数据成员在<定义或说明>时前面加关键字static。      

    (7)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误) 

    (8)静态成员初始化与一般数据成员初始化不同:

    初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
    初始化时不加该成员的访问权限控制符private,public等;        
    初始化时使用作用域运算符来标明它所属类;
               所以我们得出静态数据成员初始化的格式:
    <数据类型><类名>::<静态数据成员名>=<值>

    (9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。

    private:声明当前被修饰的变量、方法为私有的。这里的私有指的是仅仅可以被私有访问。

    private static  和  public static 都是静态变量,在类加载时就定义,不需要创建对象,
    但是private static 是私有的,不能在外部访问,只能通过静态方法调用,这样可以防止对变量的修改
    public static 是公开的,在外部就可以访问,且可以对该值修改,

    因为被static修饰的方法只能调用被static修饰的属性(static修饰的属性不仅仅能被static修饰的方法调用),所以如果一个私有属性会被静态方法调用的话,那么就需要将这个
    属性设置为静态属性。私有工具方法也可以设置为private static

    在编程中,如果不希望静态变量随意修改,就应该声明private(私有)的,这样外部不能随意修改,此时在把构造函数私有,这样这个变量就没有办法使用一般方法修改了

  • 相关阅读:
    ant 软件包不存在报错
    在 Internet Explorer 中使用 Windows 窗体控件
    智能客户端
    Back to the Future with Smart Clients
    "Automation 服务器不能创建对象" 的解决方案
    Top 10 Reasons for Developers to Create Smart Clients
    Updater Application Block for .NET
    Smart Client Application Model and the .NET Framework 1.1
    Security and Versioning Models in the Windows Forms Engine Help You Create and Deploy Smart Clients
    智能客户端技术总结(二)
  • 原文地址:https://www.cnblogs.com/BillowJ/p/12759972.html
Copyright © 2011-2022 走看看