精华内容
下载资源
问答
  • 1.static变量有什么作用呢? 在函数体内,值维持不变,具有“记忆”功能; ...2.在C++中,类内数据成员声明前加上static就变成了静态数据成员#include int main() { printf("hello, world!\n")

    一、static变量有什么作用呢?
    (1) 在函数体内,值维持不变,具有“记忆”功能;
    (2)在模块内(但在函数体外),不能被模块外的其他函数访问;
    (3)只在一个源文件中有效,不能被其他源文件使用。

    引申:static变量只初始化一次
    分析以下一段代码:

        #include<stdio.h>
        void fun(int i)
        {
          static int value=i++;//static的初始化语句只执行了一次
          value=i++;
          printf("%d\n",value);
         }
        int main()
        { 
          fun(0);
          fun(1);
          fun(2);
          return 0;
         }
    
    

    程序输出为
    1
    1
    2

    在调用fun(0)后再次调用fun(i)函数时,程序会跳过static变量的定义语句,只执行value=i++语句。

    二、在C++中,类内数据成员声明前加上static就变成了静态数据成员,有以下特点:
    (1)该类的所有对象共享访问该静态数据成员的一份复制品,而不是每个对象都有该成员的复制
    (2)静态数据成员存储在全局数据区
    (3)它与普通数据成员一样遵从public、protected、private访问规则
    (4)static成员变量的初始化是在类外,此时不能再带上static关键字。类的 静态数据成员在 类内只能声明,定义和初始化必须在类外

    注意:在头文件中定义静态变量的做法不可行,如果在使用了该头文件的每个C/C++语言文件中定义静态变量,编译后,在每个头文件中都会单独存在一个静态变量,会造成资源的浪费,也可能引起程序错误

    展开全文
  • 静态类成员包括静态数据成员和静态函数成员两部分。 一 、静态数据成员:  类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。...所以,静态数据成员的定义
    静态类成员包括静态数据成员和静态函数成员两部分。 
    • 一 、静态数据成员: 
    类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:
    1.静态数据成员的定义。
    静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。
    其定义方式与全局变量相同。举例如下:
    xxx.h文件 
    class base{ 
    private: 
    static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。 
    }; 


    xxx.cpp文件 
    const int base::_i=10;//定义(初始化)时不受private和protected访问限制. 


    注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。
    2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:
    class base{ 
    public : 
    static int _num;//声明 
    }; 
    int base::_num=0;//静态数据成员的真正定义 
    class derived:public base{ 
    }; 
    void main() 
    { 
    base a; 
    derived b; 
    a._num++; 
    cout<<"base class static data number _num is"<<a._num<<endl; 
    b._num++; 
    cout<<"derived class static data number _num is"<<b._num<<endl; 
    } 
    // 结果为1,2;可见派生类与基类共用一个静态数据成员。

     
    3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下:
    class base{ 
    public : 
    static int _staticVar; 
    int _var; 
    void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员 
    void foo2(int i=_var);//错误,_var为普通数据成员 
    }; 


    4.静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。举例如下:
    class base{ 
    public : 
    static base _object1;//正确,静态数据成员 
    base _object2;//错误 
    base *pObject;//正确,指针 
    base &mObject;//正确,引用 
    }; 


    5.静态数据成员的值在const成员函数中可以被合法的改变。举例如下:
    class base{ 
    public: 
    base(){_i=0;_val=0;} 
    
    mutable int _i; 
    static int _staticVal; 
    int _val; 
    void test() const{//const 成员函数 
    _i++;//正确,mutable数据成员 
    _staticVal++;//正确,static数据成员 
    _val++;//错误 
    } 
    }; 
    int base::_staticVal=0; 


    • 二、静态成员函数 
    1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
    class base{ 
    static int func1(); 
    int func2(); 
    }; 
    int (*pf1)()=&base::func1;//普通的函数指针 
    int (base::*pf2)()=&base::func2;//成员函数指针 


    2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。
    3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下:
    class base{ 
    virtual static void func1();//错误 
    static void func2() const;//错误 
    static void func3() volatile;//错误 
    }; 


    最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。
    展开全文
  • 静态数据成员

    2014-11-25 22:29:20
    静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据...1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员

    静态类成员包括静态数据成员和静态函数成员两部分。

    一 静态数据成员:

    类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:

    1.静态数据成员的定义。
    静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。
    其定义方式与全局变量相同。举例如下:

    xxx.h文件
    class base{
    private:
    static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
    };

    xxx.cpp文件
    const int base::_i=10;//定义(初始化)时不受private和protected访问限制.

    注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。

    2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:
    class base{
    public :
    static int _num;//声明
    };
    int base::_num=0;//静态数据成员的真正定义

    class derived:public base{
    };

    main()
    {
    base a;
    derived b;
    a._num++;
    cout<<"base class static data number _num is"<<a._num<<endl;
    b._num++;
    cout<<"derived class static data number _num is"<<b._num<<endl;
    }
    // 结果为1,2;可见派生类与基类共用一个静态数据成员。

    3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下:
    class base{
    public :
    static int _staticVar;
    int _var;
    void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
    void foo2(int i=_var);//错误,_var为普通数据成员
    };

    4.★静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。举例如下:

    class base{
    public :
    static base _object1;//正确,静态数据成员
    base _object2;//错误
    base *pObject;//正确,指针
    base &mObject;//正确,引用
    };

    5.★这个特性,我不知道是属于标准c++中的特性,还是vc6自己的特性。
    静态数据成员的值在const成员函数中可以被合法的改变。举例如下:

    class base{
    public:
    base(){_i=0;_val=0;}

    mutable int _i;
    static int _staticVal;
    int _val;
    void test() const{//const 成员函数

    _i++;//正确,mutable数据成员
    _staticVal++;//正确,static数据成员
    _val++;//错误

    }
    };
    int base::_staticVal=0;

    二,静态成员函数
    静态成员函数没有什么太多好讲的。

    1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
    class base{
    static int func1();
    int func2();
    };

    int (*pf1)()=&base::func1;//普通的函数指针
    int (base::*pf2)()=&base::func2;//成员函数指针


    2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。

    3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下:
    class base{
    virtual static void func1();//错误
    static void func2() const;//错误
    static void func3() volatile;//错误
    };


    最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

    在c++类中声明成员时可以加上static关键字,这样声明的成员就叫做静态成员(包括数据成员和成员函数)。例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    classtest{
    public:
    test(){}
    ~test(){}
    public:
    //静态成员函数
    staticintgetCount(){
    returnm_nCount;
    }
    private:
    //静态数据成员
    staticintm_nCount;
    };
    inttest::m_nCount=0;

    2区别对比编辑

    静态数据成员和普通数据成员区别较大,体现在下面几点:
    (1)普通数据成员属于类的一个具体的对象,只有对象被创建了,普通数据成员才会被分配内存。而静态数据成员属于整个类,即使没有任何对象创建,类的静态数据成员变量也存在。
    (2)因为类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显示的初始化,一定要在类外进行,例如上例。
    (3)外部访问类的静态成员只能通过类名来访问,例如:test::getCount()。
    (4)类的静态成员函数无法直接访问普通数据成员(可以通过对象名间接的访问),而类的任何成员函数都可以访问类的静态数据成员。
    (5)静态成员和类的普通成员一样,也具有public、protected、private3种访问级别,也可以具有返回值、const修饰符等参数。

     

    展开全文
  • c++ 静态数据成员总结

    2011-06-24 20:04:00
    最终总结出静态数据成员的特点有:: 1、静态数据成员仅仅在初始化时,不受访问权限的约束; 2、静态数据成员最好不要在.h文件中进行声明,而是放在.o文件中声明; 3、静态数据成员被类的所有对象所共享,包括类的...

    最终总结出静态数据成员的特点有::

              1、静态数据成员仅仅在初始化时,不受访问权限的约束;

              2、静态数据成员最好不要在.h文件中进行声明,而是放在.o文件中声明;

              3、静态数据成员被类的所有对象所共享,包括类的派生类的所有对象;——即派生类和基类共享一个静态成员。

              4、静态数据成员的类型可是所属类自己,即在一个类中可以声明该类自己的类型的静态成员对象,但是,不可以定义普通的成员对象,(指针可以)

              5、在const成员函数中,可以修改static成员变量的值。普通成员变量的值,是不能修改的。

              6、static成员函数只能访问static成员,不能访问非static成员,并且static成员函数不能定义为const函数。

    展开全文
  • 1、静态成员函数、静态数据成员 在类中,用static修饰的...静态成员函数和静态数据成员有自己独有的特点和用法,定义方法如下: 1 class Tank{ 2 public: 3 static void func(void); // 声明静态成员函数 ...
  • 今天编程的时候遇到一个编译错误,是因为静态成员函数中,有对非静态数据成员的操作,导致系统将数据成员识别为未定义。针对问题总结了一下静态成员函数和静态数据成员 1. 静态数据在在外被初始化,并且,所有的...
  • C++的静态数据成员

    千次阅读 2008-04-21 18:11:00
    静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据...静态数据成员的定义。 
  • C++静态数据成员

    2012-03-16 15:26:37
    静态类成员包括静态数据成员和静态函数成员两部分。 一、 静态数据成员:  类体中的数据成员的声明前加上static关键字,该数据成员就成为了...静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所
  • 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:  1.静态数
  • 静态成员函数有以下特点: 可以通过class::function方式调用,不用生成实例 不能访问非静态的成员变量 静态成员函数是类一部分,而非对象一部分。 非静态成员函数调用时还隐式传进一个this指针,静态成员...
  • 静态类成员包括静态数据成员和静态函数成员两部分。 一、 静态数据成员:  类体中的数据成员的声明前加上static关键字,该数据成员就成为了...静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所
  • //静态的东西是随着类加载而加载,随着类小时而消失,优先于对象存在,可以通过类名直接访问。 public class Tedian { public static void main(String[] args) { System.out.println(Students.type);//...
  • C++静态数据成员定义及应用浅谈

    千次阅读 2012-08-24 14:23:10
    类体中的数据成员的声明前加上static...1.C++静态数据成员的定义。  静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下
  • C++静态数据成员介绍

    2012-05-28 12:24:08
    C++编程语言从出现至今已经历经20年之久。在这20年中,它凭借自己独特的性能,及灵活的应用方式占据着开发领域中一个非常...今天我们就从C++静态数据成员开始分析这一语言的相关特点。  类体中的数据成员的声明前
  • 静态成员特点

    千次阅读 2018-07-23 21:47:32
    (1)static数据成员在类内部声明,但只能在类外部定义,在类外部不能指定static,在类定义时候进行初始化; (2)static数据成员只能在类外部进行初始化(特例:当整型const static数据成员被常量表达式...
  • 静态友元常量成员

    2021-06-02 22:51:55
    静态友元常量成员 一、静态成员 1、知识点介绍 1、静态成员,指的是在C++类中声明...3、静态数据成员的特点 1、类中静态数据成员,所有对象都共享该数据,只有一份内存在内存中 2、类中的静态数据成员,必须要在类
  • 1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下: xxx.h文件 class base{ private: static const ...
  • C#静态成员特点

    2015-03-22 11:41:00
    在C#4.0中,即使没有创建类实例,也可以调用该类中静态方法、字段、属性或事件。  如果创建了该类任何实例,不能使用实例来访问静态成员。 与C++一样,C#中,静态方法和属性...此外:静态数据在程序运行...
  • 一:静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了...1、静态数据成员的定义。 静态数据成员实际是类域中的全局变量,其定义方式与全局变量相同。 例如: class base { pr...
  • 静态成员

    2016-03-25 14:49:04
    静态类成员包括静态数据成员和静态函数成员 一 静态数据成员: ...类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员...所以,静态数据成员的
  • 静态成员

    2019-05-11 19:19:31
    一、静态数据成员 二、静态成员函数 概念:在C++类定义中,不为某个对象独享,而是为类所有对象所共享数据叫做静态成员。 特点:不管这个类创建了多少个对象,其静态成员在内存中只保留一份拷贝,这个拷贝...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 934
精华内容 373
关键字:

静态数据成员的特点