精华内容
下载资源
问答
  • C++类中的静态成员变量和静态成员函数的作用
  • C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...
  • 静态成员变量和静态成员函数 class ClassA { int a; int b; static int c; //静态成员变量 static void xxx_fun() //静态成员函数 { ... } } 普通成员变量每个对象都有各自的一份,静态成员变量所有对象...
  • java中什么叫静态成员变量

    千次阅读 2021-02-26 08:24:08
    静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...

    4baaa6d80bed31b166ff09822d7ced10.png

    静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。

    由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。

    1. 静态局部变量

    在局部变量的说明前再加上static说明符就构成静态局部变量。

    例如:

    static int a,b;

    static float array[5]={1,2,3,4,5};

    静态局部变量属于静态存储方式,它具有以下特点:

    (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

    (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

    (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。

    (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜

    —————————————————————————————————————————————————————————

    给读者一个简单直白的例子(区别静态局部变量和动态局部变量):

    ——————————************************************************************——————————

    int fun(int n)

    {

    static int f=1; /*请注意这行的修改*/ 这是 static 结果:

    f=f*n;

    return(f);

    }

    main()

    {

    int i;

    for(i=1;i<=5;i++)

    printf("%d!=%d\n",i,fun(i));

    }

    ——————————************************************************************——————————

    int fun(int n)

    {

    int f=1; /*请注意这行的修改*/ 结果是:

    这是auto 的结果

    f=f*n;

    return(f);

    }

    main()

    {

    int i;

    for(i=1;i<=5;i++)

    printf("%d!=%d\n",i,fun(i));

    }

    ————————————————————————————————————————————————————————————————

    2.静态全局变量

    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

    静态变量

    除范围之外,变量还有存活期,在这一期间变量能够保持它们的值。在应用程序的存活期内一直保持模块级变量和公用变量的值。但是,对于 Dim 声明的局部变量以及声明局部变量的过程,仅当过程在执行时这些局部变量才存在。通常,当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。

    但可将局部变量定义成静态的,从而保留变量的值。在过程内部用 Static 关键字声明一个或多个变量,其用法和 Dim 语句完全一样:

    Static Depth

    例如,下面的函数将存储在静态变量 Accumulate 中的以前的运营总值与一个新值相加,以计算运营总值。

    Function RunningTotal (num)

    Static ApplesSold

    ApplesSold = ApplesSold + num

    RunningTotal = ApplesSold

    End Function

    如果用 Dim 而不用 Static 声明 ApplesSold,则以前的累计值不会通过调用函数保留下来,函数只会简单地返回调用它的那个相同值。

    在模块的声明段声明 ApplesSold,并使它成为模块级变量,由此也会收到同样效果。但是,这种方法一旦改变变量的范围,过程就不再对变量排他性存取。由于其它过程也可以访问和改变变量的值,所以运营总值也许不可靠,代码将更难于维护。

    声明所有的局部变量为静态变量

    为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static 关键字。例如:

    Static Function RunningTotal (num)

    这就使过程中的所有局部变量都变为静态,无论它们是用 Static、Dim 或 Private 声明的还是隐式声明的。可以将 Static 放在任何 Sub 或 Funtion 过程头的前面,包括事件过程和声明为 Private 的过程。

    ◆◆

    评论读取中....

    请登录后再发表评论!

    ◆◆

    修改失败,请稍后尝试

    展开全文
  • 1)静态成员变量是存储方法 区内存中,而且只会存在一份数据。 2)非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。 生命周期的区别: 1)静态的成员变量数据是随着类的加载而存在,随着类文件的消失而...

    静态的成员变量与非静态的成员变量的区别:

    1. 作用上的区别:
      1) 静态的成员变量的作用是共享一个数据给所有的对象使用。
      2)非静态的成员变量的作用是描述一类事物的公共属性。
    2. 数量与存储位置上的区别:
      1)静态成员变量是存储方法 区内存中,而且只会存在一份数据。
      2)非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。
    3. 生命周期的区别:
      1)静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
      2)非静态的成员数据是随着对象的创建而存在,随着对象被垃圾回收器回收而消失。
    展开全文
  • 静态全局变量,在其他文件中可以定义相同的名字而不会发生冲突; 静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到一下次的调用,直到下次赋值; 静态函数只能在声明它的文件当中可见,不能被其他

    为了便于理解,我们先来说说面向过程设计中的static,对理解面向对象设计中的static多少会有些裨益,也可以加深大家对这方面知识的理解。面向过程中设计中的static主要从以下几个方面来进行说明:

    • 静态全局变量,在其他文件中可以定义相同的名字而不会发生冲突;
    • 静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到一下次的调用,直到下次赋值;
    • 静态函数只能在声明它的文件当中可见,不能被其他文件使用,在其他文件中可以定义相同名字的函数,不会发生冲突。

    面向对象设计中的static
    一、静态数据成员
    1、概念
    静态数据成员在全局数据区分配内存,而非静态成员需要实例化才会分配内存。
    对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问,所以静态数据成员的值对每个对象都是一样的,它的值可以更新。
    而对于非静态数据成员,当类别实例化后,可以通过实例化的类名进行访问,非静态数据成员的生存期取决于该类的生存期,而且每个类对象都有自己的拷贝。而静态成员则不存在生存期的概念,因为静态数据成员始终驻留在内存中。
    2、静态数据成员初始化
    静态数据成员初始化与一般数据成员的初始化不同,

    <数据类型><类名>::<静态数据成员> = <>;
    eg:int MyClass::sum = 0;

    静态数据成员主要用在各个对象都有相同的某项属性的时候。eg:存款类,每个对象的利息相同,所以把利息设为静态数据成员。
    好处:1、不管定义多少个存款类的对象,利息数据成员都共享分配在全局数据区的内存,所以节省了存储空间;2、一旦利息需要改变是,只要改变一次,则所有存款类对象的利息全部改变过来了。

    二、静态成员函数
    1、概述
    静态成员函数为类全部服务,而不是为类的具体某一个对象服务。
    2、普通成员函数和静态成员函数的区别
    普通成员函数一般都隐藏了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。
    一般,this指针是缺省的,但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,静态成员函数无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
    3、举例说明

    #include <iostream>
    using namespace std;
    
    class MyClass {
    public:
        MyClass(int a,int b,int c);
        static void func();
    private:
        int a, b, c;
        static int sum;
    };
    int MyClass::sum = 0;
    
    MyClass::MyClass(int a,int b,int c)
    {
        this->a = a;
        this->b = b;
        this->c = c;
        sum += a + b + c;
    }
    
    void MyClass::func()
    {
        cout << "sum=" << sum << endl;
    }
    
    void main()
    {
        MyClass M(1, 2, 3);
        M.func();
    
        MyClass N(4,5,6);
        N.func();
    
        MyClass::func();// 静态成员函数的访问
    
        return;
    }

    运行结果:
    这里写图片描述

    由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比,速度上会有少许的增长。需要总结一点的是,静态成员不能访问非静态成员,非静态成员可以直接访问类中的静态成员。

    展开全文
  • C++的静态成员变量和静态成员函数

    万次阅读 2019-05-22 15:35:41
    C++的静态成员变量和静态成员函数 静态成员变量和静态成员函数算是C++面向对象编程中的一个重点和难点,这里的静态具体指什么呢?与普通的成员变量和成员函数相比,静态成员函数和静态成员变量是属于类的,而不是...

    C++的静态成员变量和静态成员函数

    静态成员变量和静态成员函数算是C++面向对象编程中的一个重点和难点,这里的静态具体指什么呢?与普通的成员变量和成员函数相比,静态成员函数和静态成员变量是属于类的,而不是属于对象的,也就是说,在类实例化为对象之前,静态成员变量和静态成员函数就已经分配了内存空间了,而普通成员函数和成员变量只有在对象产生之后才会分配空间。下面我们来详细看看他们的用法

    (一)静态成员变量

    1.在类中声明静态数据成员只要加上static关键字即可:

    class A{
    private:
    	static int a;
    	//这样a就是类A的静态成员变量了
    };
    

    特别注意:在使用静态成员变量之前一定要初始化。初始化静态成员变量,必须在全局作用域中定义,如果定义的时候不给出初值,则默认初值为0。当然,静态成员变量在类中只能声明而不能定义的。

    2.静态成员变量不属于任何对象,静态成员变量是由类的所有对象共享的

    静态成员变量只存储一份供所有对象共用,所以在所有对象中都可以共享它的值,使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
    下面我们来看一个小例子:

    class A {
    public:
    	static int a;
    };
    int A::a = 0;
    
    int main() {
    	A temp0;
    	temp0.a = 5;
    	A temp1;
    	cout << temp0.a << endl;
    	cout << temp1.a << endl;
    }
    

    很显然输出结果是两个5,这也很容易说明静态成员变量是所有对象共享的,他的值在这个类中的任何一个对象中都相同。

    3.静态成员变量在const函数中可以修改

    class A {
    public:
    	static int a;
    	int b;
    	void changea(int i) const {
    		this->a = i;
    	}
    	/*void changeb(int j) const {
    		this->b = j;
    	}*/
    	//很显然,这段被注释的代码会报错
    };
    int A::a;
    
    int main() {
    	A temp0;
    	temp0.changea(6);
    }
    

    cosnt函数的作用是保护调用这个const函数的对象(即this指针指向的对象)的所有普通成员变量,使其不能被修改,但是静态成员变量不属于任何对象,所以可以修改。

    (二)静态成员函数

    静态成员函数的声明很简单,只要在类的成员函数前加上static关键字即可,静态成员函数也是属于类的,它并不属于任何对象。静态成员函数中是不能访问本类中的非静态成员变量的,所以在c++中,静态成员函数的主要功能就是访问静态成员变量。当然,非静态成员函数也可以访问静态成员变量。

    下面我们来看一个例子:

    class A {
    public:
    	static int a;
    	int b;
    	static void showa(){
    		cout << a << endl;
    	}
    	/*static void showb() {
    		cout << b << endl;
    	}*/
    	//这段被注释的代码会报错
    };
    int A::a = 9;
    
    int main() {
    	A temp0;
    	temp0.showa();
    }
    

    很明显我们可以看出静态成员函数无法访问非静态成员变量。

    下面列出使用静态成员函数的几个注意点:

    1.静态成员函数不能调用非静态成员函数,但是非静态成员函数可以调用静态成员函数
    2.静态成员函数没有this指针,也就是说静态成员函数不能使用const修饰符
    3.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存。

    静态成员函数的一个优点是可以在任何类的实例被创建之前调用它们,这使得它们可以用来执行复杂的初始化任务,这些任务必须在创建类的对象之前完成。

    总结一下:其实不论是静态成员变量还是静态成员函数,它们都是不依赖于对象而存在的。
    对于非静态成员变量和非静态成员函数,类在定义之后并不为他们分配存储空间,而是在定义类的对象的时候才分配存储空间。相反,静态的成员变量和静态的成员函数在定义类时已经在内存中开辟了内存空间,所以静态成员变量可以被独立的访问(在任何对象没有建立起来时都可以访问),并且静态成员函数不可以调用非静态成员函数,因为非静态成员函数只有在类对象建立以后才可以调用。

    2019年5月22日

    展开全文
  • 昨天在修改项目函数功能时,在其中一个类中添加了一个静态成员变量和两个静态成员函数,结果在链接时出现一个非常典型的错误:“The follwing symbols referenced in processor “p0” could not be resolved:Class:...
  • 静态成员:静态类中的成员加入static修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态成员,因为静态成员...
  • 1.首先,静态成员变量作用是什么? 作用:为了同一个类的所有对象之间能够“共享”数据。 2.那私有的静态成员变量又是咋回事呢? private修饰的静态成员变量只能在类内访问,但也必须在类外初始化,并且只能通过...
  • Python中,静态成员变量称为类变量,非静态成员变量称为实例变量。 基本概念 类变量: 类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。类变量在整个实例化的对象中是公用的。 实例变量: ...
  • C++中类的(static)静态成员变量与(static)静态成员函数

    万次阅读 多人点赞 2018-08-04 11:27:28
    而在C++的类中,也有静态成员变量同时还有静态成员函数,先来看看C++中静态成员变量与静态成员函数的语法: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class ...
  • 通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
  • 在java中,成员变量分为两种:实例成员变量和静态成员变量。 1.1.1实例成员变量 实例成员变量:是定义在方法外部和类内部的且不被static所修饰的变量.用于描述一个类中包含哪些数据 代码示例: class Person ...
  • C++ 类静态成员变量声明和定义

    千次阅读 2018-11-04 16:45:36
    这是在学习C++类中的一个简单总结 静态成员变量的声明和定义的
  • 文章目录类中静态成员变量与静态成员函数的特点静态成员变量示例代码typeid运算符静态成员函数示例代码this指针访问权限 类中静态成员变量与静态成员函数的特点 在类中以static 修饰的变量以及函数称为静态成员变量...
  • C++ static静态成员变量用法

    千次阅读 2019-09-28 22:47:25
    C++ static静态成员变量用法 参考网址: 1、http://c.biancheng.net/cpp/biancheng/view/209.html 2、https://www.runoob.com/cplusplus/cpp-static-members.html c++中: 1、在.h文件的类中定义静态的public ...
  • 1. 类中静态成员变量与非静态成员变量的区别 (1).生命周期: 静态成员变量从类被加载开始到类被卸载,一直存在。 普通成员变量只有在类创建对象后才开始存在,对象结束,它的生命也就告终。 (2).共享方式: 静态...
  • C++静态成员变量和静态成员函数使用总结

    万次阅读 多人点赞 2016-05-16 09:11:58
    C++静态成员变量和静态成员函数使用总结: 一.静态成员变量:   类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/...
  • php static静态成员变量

    千次阅读 2018-05-17 16:19:54
    在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量作用域,用法越看越困惑,所以查了下资料。static用法如下:1.static 放在函数内部修饰变量2.static放在类里修饰属性,或方法3....
  • 静态成员变量的初始化

    千次阅读 2017-03-16 16:43:00
    我们定义如下类: 复制代码 //A.h class A ...其中包含三个私有的静态成员,C++规定const静态成员可以直接初始化,其他非const的静态成员需要在类声明以外初始化,我们一般选择在类的实
  • 实例变量(成员变量) 在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。 当一个对象被实例化之后,每个实例变量的值就跟着确定; 实例变量在对象...
  • static(静态)变量有什么作用?

    千次阅读 2017-07-12 23:12:35
    2)在模块内(但在函数体外),它的作用域范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有的函数访问,但不能被模块外其他函数访问。它是一个本地的全局变量,如果一个函数被声明为静态...
  • 问题4:在程序执行过程中,其他类的对象改变静态成员变量的值,那么相应的在建立另一个对象时的静态成员值会是初始化的值还是上一次改变的值? 问题5:类的非静态成员函数中能访问静态成员变量么? 问题6:类的静态...
  • 简单点说,从源代码看,该功能是否需要访问非静态成员变量,如果需要,该功能就是非静态的. 如果不需要,就可以将该功能定义成静态的. 当然也可以定义成非静态,但是非静态需要被对象调用,而创建对象调用非静态的没有...
  • 实例方法必须在类实例化后通过对象来调用,而静态方法可以在类实例化之前就使用。...静态方法在访问本例的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实
  • C++静态成员变量的初始化

    万次阅读 多人点赞 2014-03-03 16:53:37
    1.static成员的所有者是类本身,但是多个对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。 2.静态成员不能在类定义里边初始化,只能在class body外初始化。 3.静态成员仍然遵循public,...
  • // 定义静态成员变量 public void call() { // 定义成员方法 System.out.println("调用call()方法"); for (i = 0; i &lt; 3; i++) { System.out.print(i + " "...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 240,867
精华内容 96,346
关键字:

静态成员变量的作用