精华内容
下载资源
问答
  • C++静态变量

    千次阅读 2019-09-11 11:41:36
    静态变量的静态指在整个程序生命周期的地址静止不变。也就是说在整个程序里面只保存有一份拷贝。static关键字允许它在不同的函数调用间保持它的值。如果一个静态变量被访问后值改变,它就会保持新的值。 在C++中,...

    静态变量的静态指在整个程序生命周期的地址静止不变。也就是说在整个程序里面只保存有一份拷贝。static关键字允许它在不同的函数调用间保持它的值。如果一个静态变量被访问后值改变,它就会保持新的值。

    在C++中,类的静态成员(static member)必须在类内声明,在类外初始化。

    要注意的是,静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存。初始化是赋一个初始值,而静态成员变量只需要定义(分配内存)即可,可以不赋初值,类外定义后默认为0。

    静态成员函数和静态成员变量的使用都可以通过类名+"::"的方式进行使用,此外,对于类的对象,指针或引用,也可以直接调用。

    #include <stdio.h>
    class A {
        public:
        static int a; //声明但未定义
    };
    int A::a ; //定义静态成员变量。不给初值默认为0
    int main() {
        printf("%d", A::a);//输出0
        return 0;
    }
    

    静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员。

    C++规定,const的静态成员可以直接在类内初始化,而非const的静态成员需要在类外声明以初始化。所以,能在类中初始化的成员只有一种,那就是静态常量成员

    class A
    {  // 静态常量成员可以在类内初始化
        private: static const int count = 0;
    };

    静态成员和常量成员都不能在类内初始化,错误示范:

    class A
    {   // 静态成员不能在类内初始化
        private: static int count = 0;
    };
    class A
    {   // 常量成员不能在类内初始化
        private: const int count = 0;
    };
    

     

    展开全文
  • c++静态变量

    千次阅读 2018-08-08 16:22:34
    存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。  作用域: 变量的可见代码域(块作用域,函数...

    首先要理解生存周期与作用域的区别: 
    生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。 
    作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。

    static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。

    举一个局部声明的例子。在函数test中声明静态变量i: 

    #include<iostream>
    using namespace std;
    void test();//函数原型
    
    void test()
    {
    	static int m=5;
    	m+=1;
    	cout<<m<<endl;	//m作为静态变量,存在于整个程序运行周期中, 
    }
    int main()
    {
    
    	//int m=3; 
    	 static int i=5;
    	i=5;
    	test();
    	test();
    	test();
    	test();
    	test();
    	return 0;
    }
    

    运行结果



    局部变量m存放在栈中,当test函数结束,m将被销毁;静态变量i不存放在栈中,而是存放于程序的全局变量区域,因此随着函数test的结束,它并不随着出栈操作而被销毁,它的生存周期存在于程序的整个运行期;然而m和i的作用域都仅存在于test函数中它们的定义之后,即test调用结束之后,m和i就不再可用,m消失,但是i仍存在于内存之中

     

    展开全文
  • 一、静态变量: 在了解静态变量之前,读者需要知道什么是全局变量和局部变量。局部变量直至定义在函数内部的变量,在函数调用结束后,局部变量将消失。全局变量是指在函数体外定义的变量,它的生命期随着程序的结束...

    一、静态变量:

    在了解静态变量之前,读者需要知道什么是全局变量和局部变量。局部变量直至定义在函数内部的变量,在函数调用结束后,局部变量将消失。全局变量是指在函数体外定义的变量,它的生命期随着程序的结束而结束。

    对于静态变量读者可以简单粗暴地理解为全局变量,但是二者又有区别。如果定义一个静态的局部变量,它的生命期在函数调用结束后依然存在,在下次调用函数时,会依然保存上一次函数调用结束之后的值。并且,对于静态变量只执行一次初始化(无论函数调用多少次)。在 C++中静态变量是使用 static 关键字来定义的。

    void Invoke()
    {
        static int s_nNum = 0;  //定义静态局部变量
        cout << s_nNum << endl;
        s_nNum++;
    }
    
    int main()
    {
        for(int i = 0; i < 10; i++)
            Invoke();
        return 0;
    }
    
    

    注:对于普通的局部变量,在函数调用时每次都会执行初始化操作,并且在函数调用结束后被销毁。对于全局变量来说,不仅能够够在当前文件中使用,而且还可以在其他文件中被使用。但是全局静态变量则不同,它的作用域是当前定义全局静态变量处到当前文件的结束,不能够在其他文件中访问全局静态变量。

    二、静态数据成员

    在类中使用 static 关键字将数据成员定义为静态成员。静态成员与静态变量是两个完全不同的概念,静态数据成员能够被同一个类的所有对象共享,可以作用于类上,通过类名来访问,简单的说,就是静态数据成员是属于这个类的全局变量。

    #include <iostream>
    using namespace std;
    
    class CUser
    {
    private:
        char m_Username[128];
        char m_Password[128];
    public:
        static int m_nCount;  //静态数据成员
        CUser()              //默认构造函数
        {
            strcpy(m_Username, "MR");
            strcpy(m_Password, "KJ");
        }
    };
    
    int CUser::m_nCount = 10;  //静态成员初始化,不需要在前边加 static
    
    int main()
    {
        CUser User;
        cout << "User 静态成员:" << User.m_nCount << endl;
        CUser defUser;
        defUser.m_nCount = 1;
        cout << "defUser 静态成员:" << defUser.m_nCount << endl;
        cout << "User 静态成员:" << User.m_nCount << endl;
        return 0;
    }
    /*=====output=======
    User 静态成员:10
    defUser 静态成员:1
    User 静态成员:1
    ==================*/

    注:对于 VC++的工程来说,静态数据成员的使用,必须现在 .h 文件中声明 static 变量,然后在对应的 .c 文件头的下方初始化静态数据成员,方可使用,否则会出现编译错误。如果在本类中调用静态数据成员,则只需要object.static;如果想要在其他类中调用另一个类的静态成员,不需要进行额外的任何操作,只需要在调用处成员变量前边加上类名::即可,例如 class::static。

    三、外部变量

    外部变量用于告诉编译器在其他文件的全局区域存在一个全局变量,目的是在当前文件中能够访问这个全局变量。外部变量的生命需要使用 extern 关键字。例如,在应用程序中,如果在一个文件中定义了一个全局变量,例如 m_nCount,为了在其他文件中能够访问全局变量 m_nCount,那么在其他文件中需要声明一个与 m_nCount 同名的外部变量。

    extern int m_nCount;

    四、自动变量

    (1)C++98 中 auto 特性

    自动变量是指变量的生命期在变量的声明时开始,在离开变量的作用域时结束,它仅限于在函数内使用。不可申明为全局的。自动变量用 auto 来声明。

    (2)C++11 中 auto 特性

    auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,详见另一位博主的文章

    https://www.cnblogs.com/QG-whz/p/4951177.html

     

    展开全文
  • C++静态变量和静态函数的小结

    万次阅读 2011-12-29 18:17:28
    C++静态变量和静态函数的小结 最近由于工作的关系,要做一个简单的输入法,当然是要移植到arm板上去的。没有想自己做,就到网上找到两个用Qt输入法打代码,自己整合了一下,最后的效果差强人意吧!在这里把整合中...

    C++静态变量和静态函数的小结


    最近由于工作的关系,要做一个简单的输入法,当然是要移植到arm板上去的。没有想自己做,就到网上找到两个用Qt输入法打代码,自己整合了一下,最后的效果差强人意吧!在这里把整合中遇到的对静态变量的使用的一点小小的总结写在这里,只当自己学习的一个记录,如有错误,还望大家指出,共同提高!
    下面通过一个简单的例子来看看:

    	class SyszuxIM:public QWSInputMethod
    	{
    	Q_OBJECT
    	public:
    	        SyszuxIM();
    	        ~SyszuxIM();
    	        void updateHandler(int);
    	
    	        static void installInputMethod();
    	        static void releaseInputMethod();
    	        static SyszuxIM* instance();
    	
    	        static SyszuxIM* pInputMethod ;
    	public slots:
    	        void confirmString(QString gemfield);
    	private:
    	        SyszuxPinyin* syszuxpinyin;
    	        //设置输入法底框的颜色
    	        void setInputColor( const QColor &color ) ;
    	
    	};

    这个里面主要是在类中有一个这个类的一个静态的指针变量。以前一直没有这么用过,其实想想在c语言结构体中是经常这么用的。链表中也就是一直这么用的,因为c++的类是结构体的一个扩展。所以在类中这么用也应该是很正常的。
    不过在c++中有种新的用法:

    	struct SyszuxIMPrivate
    	{
    	        static SyszuxIM* pInputMethod;
    	};

    因为毕竟不是要做链表用,所以单独用一个结构体来定义一个数据类型。这样看着舒服些。在这里记录一笔只是给自己留个记号,以后自己程序中可以这么用。
    下面是对静态变量与静态函数的一个总结,作为自己的个备忘录,

    在C语言中有静态数据类型,声明一个静态数据类型意味着:该变量的生存周期是
    静态的,即在程序的开始即分配到程序,终止时才释放。在C++中,声明一个类的静态数据成员意味着所有的实例只有该数据成员的一个拷贝。

      《深入浅出MFC》这样解释:
       Static 成员不属于对象的一部分,而是类的一部分。所以程序可以在没有诞生分和
      对象的时候就处理此种成员变量.但必须首先初始化它。

      不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一  
    再被调用,而变量的初值只应该设定一次。也不要把初始化操作安排在头文件中,
    因为它可能被载入到许多地方,因此就可能执行许多次。你应该在应用程序文件中,
    类以外的任何地方设定其初始值。例如在main之中,或者全局函数中,或任何函数
    之外:

    double SavingAccount :: m_rate = 0.0075;//设定atatic成员变量初值
    void main() {… …}

    这么做可曾考虑到m_rate是个private数据?没关系,设定static成员变量初值
    时,不受任何存取权限的束缚。请注意,static成员变量的类型也出现在初值设定
    中,因为这是一个初值设定操作,不是一个赋值(assignment)操作。事实上,staic
    变量在这个时候(而不在类声明中)才定义出来。如果你没有做这个初始化操作,
    会产生连接错误。
    下面是存取static成员变量的一种方式,注意,此刻还没有任何对象实例:
    //第一种存取方式:

    void main()
    {
      SavingAccount::m_rate = 0.0075; //欲此成立,须把m_rate改为public
    }

    下面是这种情况则是产生一个对象后,通过对象来处理static成员变量:
    //第二种存取方式:

    void main()
    {
       SavingAccount myAccount;
       myAccount.m_rate = 0.0075;  //欲此成立,须把m_rate改为public
    }

    Static成员变量并不是因为对象的实现才得以存在的,它本来就存在,你可以想象
    它是一个全局变量。只要access level允许,任何函数都可以存取static成员变
    量。但是如果你希望在产生任何对象之前就存取其class的private static成员
    变量,则必须设计一个static成员函数:
    由于static成员函数不需要借助于任何对象,就可以被调用,所以编译器不会为它
    暗加一个this指针。因此static成员函数无法处理类之中的non-static成员变量。


    展开全文
  • c/c++静态变量和静态函数

    千次阅读 2018-11-11 15:32:26
    而内存主要分为两类:静态存储区和动态存储区; 静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。 ...
  • c++静态变量的初始化

    2014-10-05 18:30:37
    c++编程中,如果要用到静态变量
  • 自从上了小学才发现,记忆力大不如前了,看来小的时候没有开发出来,导致记忆模块荒凉遍野...好了,关于c++静态变量及其函数的使用大概就是这样,记录一下,以后忘了还得过来翻过,不过我不能忘记我记录过啊!!!
  • 浅谈C++静态变量

    千次阅读 2012-04-18 11:43:37
    接触c++开始我不明白c++中的静态变量是什么意思,查资料搜集材料慢慢的明白了静态变量的意思。 简单的说静态变量我感觉就是变量的生命周期 变量一旦声明为静态变量就说明这个变量将一直可以用到程序结束。也就是...
  • c++静态函数/静态成员变量 特性的一点总结
  • 注意: C++静态成员变量是用static修饰的成员变量,不属于对象的一部分,而是类一部分,因此可以在没有实例化任何对象的时候使用静态成员变量。但是必须初始化它。之所以必须初始化它是因为:全局静态变量自动初始化...
  • 静态变量 undefined reference 1. c++头文件, 类中定义static 变量,不要在头文件内类外做初始化(头文件被多次包含,会引起多重定义),也不能在构构函数内初始化。 (1.对于类中的静态成员是单独存储的,而不是...
  • C++静态变量(static)与动态变量

    千次阅读 2019-01-27 23:50:51
    #include "stdafx.h" #include &...//静态局部变量,具有全局寿命,局部作用域,只在第一次进入函数时被初始化 int c=10;//局部变量,每次进入函数时都初始化 cout&lt;&...
  • C++静态变量、临时变量、性能分析

    千次阅读 2015-05-07 16:12:31
    现在有这个疑问,我有一个功能函数需要频繁调用,这个函数里面的临时变量比较多,我担心这么多的临时变量在这个高频调用的函数里面会影响程序执行的效率,我想将这些局部临时变量改为局部静态变量,不知道这样做能不...
  • C/C++静态变量static详解

    万次阅读 2015-09-12 08:07:29
    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。  静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。 用法1:函数内部声明...
  • C/C++静态变量初始化的问题归根节点在于一点:静态变量的创建顺序 【禁止或不推荐】用函数返回值初始化静态变量 int func() { return 50; } void test() { static int i = func(); } int main() { test...
  • 今天很low逼的发现,一直以来以为在visual studio 编译器中, static定义的函数内变量是线程安全的, 今天项目中的一个单例测试问题给了我一课,也给大家分享一下,避免像我这样半桶水的再掉坑里。代码是这么写的: ...
  • C++静态变量为何只能初始化一次

    千次阅读 2014-02-11 23:35:22
    static 关键字的作用: ...static全局变量是限定作用域的全局变量。  static函数只能被本文件里的内容使用(相当于私有函数),是限定作用域的全局函数。  C++里头的static函数是相对成员函数而言
  •  对象的时候就处理此种成员变量.但必须首先初始化它。  不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一  再被调用,而变量的初值只应该设定一次。也不要把初始化操作安排在头文件...
  • C++ 静态变量之为什么只初始化一次

    千次阅读 2012-07-19 14:48:01
    以下内容由在论坛中讨论而成,在此总结一下: ...当这个函数被反复调用时,i的值是会一直加的,也就是静态变量只被初始化了一次. 我对此产生了疑惑.不知道大家有没有. 当改为: int fun() { int i=0;
  • #include using namespace std; void main() { static int *a =new int(3); const char* a=new char[128]; }
  • c++类中定义的static变量 需要在 类外初始化,且前面没有static。例如: M.h: #include class MonitorPThread {  public:  static pthread_mutex_t mut;     MonitorPThread();  ~MonitorPThread...
  • 最近复习C++的一些知识,遇到了一个我比较容易混淆、傻傻分不清的知识点,那就是C++变量的类型初始化或赋初值,大致有普通成员变量静态成员变量、成员常量这三种,还有一种组合的静态成员常量。 看到这几种数据...
  • c++全局变量与静态变量

    千次阅读 2019-03-29 19:12:12
    全局变量和和由static修饰的静态变量都被储存在全局数据区。全局数据区的内存在程序运行时会被全部置'0'.这不同于局部变量,局部变量在栈上分配内存,但此块内存一般不为零,且编译器不会在局部变量被声明的地方为其...
  • 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 2. ...
  • C++全局变量与静态变量的构造与析构顺序 本人是C++的初学者,将自己学习过程中的一些收获记录在CSDN上,一方面能为大家提供帮助,另一方面能够方便自己日后查看。 关于在C++全局变量与静态变量的构造与析构顺序,...
  • C++静态成员变量和静态成员函数

    千次阅读 2015-11-29 20:28:41
    C++静态成员变量和静态成员函数 数据成员可以分静态变量、非静态变量两种.  静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态...
  • 2、C++全局静态变量的析构销毁顺序是未定义的,特别是在多线程环境,多dll环境下,特别复杂,但是在某个编译器下,析构顺序是一定,按着构造的反顺序析构,其他都是随机,不确定的。 3、堆、栈、静态存储区 1...
  • C++ 全局变量静态全局变量、局部变量静态局部变量的使用,整理表格如下:分类 全局变量 静态全局变量(static) 局部变量(auto) 静态局部变量(static) 作用域 全局作用域(extern) 文件作用域(当前文件) 局部作用域...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 274,471
精华内容 109,788
关键字:

c++静态变量

c++ 订阅