b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

C / C ++中静态全局变量和局部变量的用法

电脑杂谈  发布时间:2020-04-10 03:28:41  来源:网络整理

c语言函数static_c语言static函数_c   类 static 函数

static是C / C ++中常用的修饰符,用于控制变量的存储和可见性.

1.1静态介绍

我们知道函数内部定义的变量,当程序执行到其定义时,编译器会在栈上为其分配空间,函数在栈上分配的空间将在函数执行结束时释放,因此出现一个问题: 如果要将变量的值保存到函数中,直到下一次调用,该怎么办?想到它的最简单方法是将其定义为全局变量,但是定义全局变量有许多缺点. 最明显的缺点是,它破坏了此变量的访问范围(因此,此函数中定义的变量不仅受此函数控制. ). static关键字可以很好地解决此问题.

此外,在C ++中,您需要一个数据对象而不是对象来服务整个类,并且同时努力不破坏该类的封装,即要求此成员成为对象. 隐藏在类内部,对外部不可见. 它定义为静态数据.

全局(静态)存储区: 分为DATA部分和BSS部分. DATA部分(全局初始化区域)存储已初始化的全局变量和静态变量; BSS节(全局未初始化区域)存储未初始化的全局变量和静态变量. 它在程序结束时自动释放. 在执行程序之前,系统将自动清除BBS段,因此在执行程序之前,未初始化的全局变量和静态变量为0. 程序开始运行时,将初始化存储在静态数据区域中的变量,这是唯一的初始化.

C ++中static的内部实现机制: 程序开始运行时,静态数据成员必须存在. 由于该函数是在程序运行时调用的,因此静态数据成员无法在任何函数中分配空间并进行初始化.

通过这种方式,可以为空间分配三个位置. 一个是类的外部接口的头文件,其中有类的声明;第二个是类定义的内部实现,并且有类成员函数定义;程序main()函数之前的全局数据声明和定义.

静态数据成员必须实际分配空间,因此不能在类声明中定义它们(只能声明数据成员). 类声明仅声明类的“大小和规格”,并且不执行实际的内存分配,因此在类声明中编写定义是错误的. 也不能在头文件的类声明中从外部定义它,因为它将在使用该类的多个源文件中引起重复的定义.

引入了

static来告诉编译器将变量存储在程序的静态存储区域中而不是堆栈中. 静态数据成员按照它们在定义中出现的顺序进行初始化. 注意静态成员的嵌套,以确保它们是嵌套成员已被初始化. 消除的顺序是初始化的相反顺序.

优点: 您可以节省内存,因为它是所有对象共有的. 因此,对于多个对象,静态数据成员仅存储在一个位置中,以便所有对象共享. 每个对象的静态数据成员的值都相同,但可以更新其值. 只要将静态数据成员的值更新一次,就可以保证所有对象在更新后都访问相同的值,从而可以提高时间效率.

c   类 static 函数_c语言函数static_c语言static函数

2. 静态在C / C ++ 2.2中的作用静态变量和普通变量

静态全局变量具有以下特征:

优点: 静态全局变量不能被其他文件使用;可以在其他文件中定义具有相同名称的变量而没有冲突.

(1)全局变量和全局静态变量之间的区别

常规程序将新生成的动态数据存储在堆区域中,并将函数内部的自动变量存储在堆栈区域中. 自动变量通常在函数退出时释放空间,并且静态数据(甚至函数内部的静态局部变量)也存储在全局数据区域中. 由于该功能的退出,全局数据区域中的数据将无法释放空间.

看下面的例子:

输出如下:

3. 静态用法

static关键字的最基本用法是:

由static修改的变量和由static修改的方法都属于该类的静态资源,并且在类实例之间共享. 换句话说,它们随处变化.

c   类 static 函数_c语言函数static_c语言static函数

在C ++中,静态成员属于整个类而不是一个对象,并且静态成员变量仅为所有对象存储一个副本. 因此它可以在所有对象之间共享. 使用静态成员变量来实现多个对象之间的数据共享不会破坏隐藏原理,从而确保安全性并节省内存.

静态成员的定义或声明应添加一个静态关键字. 静态成员可以由双冒号使用,即<类名称> :: <静态成员名称>.

通过类名称调用静态成员函数和非静态成员函数:

错误:

'Point::init' : illegal call of non-static member function

结论1: 该类的非静态成员函数不能通过类名来调用.

通过类的对象调用静态成员函数和非静态成员函数.

已编译并通过.

结论2: 类对象可以使用静态成员函数和非静态成员函数.

在类的静态成员函数中使用类的非静态成员.

c语言函数static_c   类 static 函数_c语言static函数

编译错误:

error C2597: illegal reference to data member 'Point::m_x' in a static member function

由于静态成员函数属于整个类,因此在类实例化对象之前已分配了空间,并且在类实例化对象后,该类的非静态成员必须具有内存空间,因此此调用为错误c 类 static 函数,就像不使用变量而是预先使用变量一样.

结论3: 非静态成员不能在静态成员函数中引用.

在类的非静态成员函数中使用类的静态成员.

已编译并通过.

结论4: 可以使用静态成员函数调用该类的非静态成员函数,反之亦然.

使用该类的静态成员变量.

在生成EXE程序时,请按Ctrl + F7进行编译,而不会出现错误,并按F7会生成链接错误.

error LNK2001: unresolved external symbol "private: static int Point::m_nPointCount" (?m_nPointCount@Point@@0HA)

这是因为类的静态成员变量必须在使用前进行初始化.

c语言函数static_c   类 static 函数_c语言static函数

在main()函数之前添加int Point :: m_nPointCount = 0;重新编译并正确链接,正在运行的程序将输出1.

结论5: 类的静态成员变量必须在使用前初始化.

思想总结: 静态资源属于该类,但是独立于该类而存在. 从J类的加载机制的角度来看,在初始化类时将加载静态资源,而在类实例化对象时将加载非静态资源. 类的初始化要早于类实例化的对象,例如Class.forName(“ xxx”)方法,该方法初始化一个类,但不实例化该对象,仅加载该类的静态资源即可. 因此,对于静态资源来说,不可能知道类中有哪些非静态资源. 但是对于非静态资源,它是不同的,因为它是在实例化对象之后生成的,因此它们属于类It可以识别所有内容. 因此,上述问题的答案非常明确:

(static Modifyed class: 它的用法比以前的用法少得多. 通常c 类 static 函数,static无法修改该类. 如果static要修改一个类,则表示该类是静态内部类(请注意static只有一个内部类可以修改),这是一个匿名内部类,就像线程池中的四个拒绝机制ThreadPoolExecutor,CallerRunsPolicy,AbortPolicy,DiscardPolicy和DiscardOldestPolicy都是静态内部类,在编写时将具体说明静态内部类的内容. 内部类To. )

3.3摘要:

常规摘要: 在该类中,static可用于修改静态数据成员和静态成员方法.

静态数据成员

静态成员函数

使用静态成员变量和类的功能加深理解的示例. 本示例创建一个学生班级. 每个学生班级对象将形成一个双向链接列表,并且一个静态成员变量用于记录双向链接列表. 首先,静态成员函数输出此双向链接列表.

程序将输出:

原始地址:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-170156-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 木村拓哉
        木村拓哉

        ipad连热点玩游戏玩的好好的

      热点图片
      拼命载入中...