zoukankan      html  css  js  c++  java
  • C++ static / const /static const 型成员变量

    C++static / const /static const 型成员变量


    static关键字的两类作用

    C++中,static关键字的两类作用分别是:

    控制可见性与 控制存储类型。


    static成员变量的来源

    staitc类型成员变量的出现是为了解决同一个类的所有对象共享参数的问题,实际上就是对存储类型的控制。在C语言中,这样的控制往往通过全局变量直线。而使用static成员变量的方法与使用global类型变量方法的相比有明显的优点:

        1. 作用域,staticmember 是在class的作用域中的,它能够防止命名的冲突。

        2. 数据封装,staticmember可以是private类型的。

        3. 易于理解。


    static成员变量的访问

    static类型成员变量的访问可以直接通过作用域的符号实现。

    在类的成员函数中可以不使用作用域的符号。


    static成员变量的定义

    与其它地方不同的是,类中的static仅仅起到变量声明的作用。Static类型的成员变量必须在类外进行定义,而无法通过构造函数进行定义。static成员变量不在类体内定义,也不在构造函数内初始化(这样就无法体现其共性)。


    C++Primer》中这样描述:

    Unlikeordinary data members, static members are not initialized through theclass constructor(s) and instead should be initialized when they aredefined.

    Thebest way to ensure that the object is defined exactly once is to putthe definition of static data members in the same file that containsthe definitions of the class noninline member functions.


    Example1





    Example2




    Example3




    Example4




    static成员变量的进一步理解


    C++Primer》中对staticdata member的描述是这样的:

    Astatic data member exists independently of any object of its class,each static data member is an object associated with the class, notwith the objects of that class.

    也就是说,静态成员是独立于对象的,是与其所在类相关联的。


    普通的成员变量是对象的一部分,而static类型的变量独立于任何的对象存在,它们不是对象的一部分。即staticmembers are not part of class objects


    1.一个static型成员变量可以作为它自身类所在的成员变量。例如:





    <C++Primer>是这样解释的:

    Ordinarymembers are part of each object of the given class. Static membersexist independently of any object and are nor part of objects of theclass type. Because static data members are not part of any object,they can be used in ways that would be illegal for nonstatic datamembers.


    1. 一个static型的成员变量可以作为默认参数。而一个非static类型的成员变量例如:





    <C++Primer>是这样解释的:

    Anonstatic data member may not be used as a default argument becauseits value cannot be used independently of the object of which it is apart. Using a nonstatic data member as a default argument provides noobject from which to obtain the member's value and so is an error.

    也就是说,使用非静态数据成员做为默认参数是错误的,因为这时没有一个具体的对象,无法从中得到成员的值。非静态成员每一个object的对象可能都不一样,而static针对每个class对象是一样的。所谓默认参数在C++effective上说是编译时绑定,说明在编译的时候就确定了他得值,非静态数据成员要到运行时候才能确定。

    3.嵌套类可以含有静态成员而局部类不能含有静态成员。


    const static类型成员变量

    Example5




    七例外的conststatic int类型

    conststatic int 类型的成员变量可以在类中进行定义。


    Example6




    Example7



    Example8




    static修饰函数体内的变量

    在函数中,被static修饰的对象只创建一次,连接方式为内部连接。在程序从main()中退出或者调用exit()时,系统自动调用该对象的析构函数(在析构函数中调用exit()可能陷入死循环)。如果用abort()退出程序,内存将不被释放。标准C库的atexit()可用于指定当程序跳出main()时应执行的操作。用atexit()注册过的函数可以在所有对象的析构之前调用。

    静态对象的销毁是按初始化的反序进行的。


    static对可见性的控制

    所有的全局对象都隐含为静态存储类。在文件范围内(不在任何嵌套结构之中)定义

    inta = 0; a被存储在程序的静态存储区。

    文件范围内所有的名字都默认采用外部连接,也就是说,被外部文件可见。而在文件范围内定义static int a = 0; a采用静态存储,内部连接。

    一旦进入局部变量,static就不再改变变量的可见性,而只改变变量的存储类型。

    static用于修饰函数时,该函数只在当前文件可见。例如staticvoid function();


  • 相关阅读:
    controller接收前台数据—中文乱码问题
    如何将Object类型转换成String类型
    Spring MVC 关于controller的字符编码问题
    互联网金融--支付结算平台的测试
    delphi控件安装(安装ODAC、TeeChart、TServerSocket、TWSocketServer、TComm)
    软件业虽然建立在硬件行业之上,门槛低、更容易,但同时也是食物链的顶端(各行各业都需要信息化,所以就造成良莠不齐。大部分人,甚至大部分公司都是搬砖的)
    要会包装自己,包装自己的第一步就是合理的写简历(适当夸大自己、争取机会)
    OSChina 周三乱弹 —— 致力于做一名优秀的女程序员鼓励师
    35岁不是不行,而是某些公司培养方式让你无论多少岁都是一颗螺丝(要避免碰到这样的公司)
    Web层的搭建
  • 原文地址:https://www.cnblogs.com/johnpher/p/2570598.html
Copyright © 2011-2022 走看看