静态(static)变量的初始
- 格式:doc
- 大小:23.00 KB
- 文档页数:4
oc static 变量在C++中,静态变量又称为静态数据成员,它与普通变量的不同之处在于,静态变量在整个程序运行期间都存在,不会因为函数或对象的销毁而消失。
静态变量可以作为类的共享数据,被所有对象所共享,也可以在全局作用域下声明和使用。
接下来,我将详细介绍静态变量在C++中的特点和用法。
1. 静态变量的声明和初始化静态变量的声明和初始化通常在类的定义中完成,但不能在类的声明中直接对静态变量进行初始化,需要在类外进行初始化。
静态变量的声明一般放在类的内部(即头文件),而初始化放在类的实现文件(即源文件)中,如下所示:cpp头文件(.h)class MyClass {public:static int count; 声明静态变量};源文件(.cpp)int MyClass::count = 0; 初始化静态变量在上述代码中,声明了一个静态变量count,并在源文件中进行了初始化。
注意,静态变量的初始化只能在类的实现文件中进行一次。
2. 静态成员函数静态成员函数是指可以直接通过类名调用的函数,该函数不依赖于任何对象,只能访问类的静态成员。
静态成员函数没有this指针,不能访问非静态成员变量和非静态成员函数。
静态成员函数通常用于执行与类相关的操作,如获取静态成员变量的值、修改静态成员变量的值等。
静态成员函数的声明和定义如下:cpp头文件(.h)class MyClass {public:static void printCount(); 声明静态成员函数};源文件(.cpp)void MyClass::printCount() { 定义静态成员函数cout << "Count: " << count << endl; 访问静态成员变量count}在上述代码中,声明了一个静态成员函数printCount,并在源文件中进行了定义。
静态成员函数可以直接通过类名调用,如MyClass::printCount()。
c语⾔中static变量详解Static翻译出来是“静态”“静⽌”的意思,在C语⾔中的意思其实和它的本意差不多,表⽰“静态”或者“全局”的意思,⽤来修饰变量和函数。
经static修饰过后的变量或者函数的作⽤域或者存储域会发⽣变化,⽽由static修饰的变量在初始值⽅⾯也会表现出static关键字的优势。
想知道经static修饰过后的变量或者函数的作⽤域或者存储域发⽣了什么变化吗,发⽣变化的原因是什么吗?请⼤家继续往下看!⼀、c程序的内存分布既然static是⽤来修饰变量和函数的,⽽变量和函数⼜是组成c程序必不可少的,C程序的内存分布图如下。
C程序由下⾯5部分组成: 1)正⽂段——CPU执⾏的机器指令部分;⼀个程序只有⼀个副本;只读,防⽌程序由于意外事故⽽修改⾃⾝指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这⾥。
3)⾮初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
4)栈——增长⽅向:⾃顶向下增长;⾃动变量以及每次函数调⽤时所需要保存的信息(返回地址;环境信息)。
5)堆——动态存储区。
是向⾼地址扩展的数据类型,是⾃下向上的扩展⽅式。
c程序内存分布图上⾯的C程序分布图很明显的告诉我们,变量是存储在栈区或者堆区或者bss段或者data段,变量的存储域为什么会有所不同呢?其实原因很简单,说⽩了就是与他们定义在程序的不同地⽅,有没有static关键字修饰有关啦,定义在不同的地⽅也说明了他们有着不同的作⽤域。
⼆、static修饰的变量1. 全局静态变量 在全局变量之前加上关键字static,全局变量就被定义成为⼀个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运⾏期间都存在) 2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化) 3)作⽤域:全局静态变量在声明他的⽂件之外是不可见的。
static在vb中的用法Static在VB中的用法Static是VB中的一个关键字,它用于定义静态变量。
静态变量是指在程序运行期间只初始化一次的变量,它们的值会在多次调用该函数时保持不变。
这种变量对于需要保留先前状态或计数器等情况非常有用。
本文将详细介绍Static在VB中的用法。
一、Static关键字的定义Static关键字用于定义静态变量,它可以修饰函数、过程或模块级别的变量。
当使用Static关键字时,该变量被赋予了一个初始值,并且这个值会在程序执行期间保持不变。
二、函数中使用Static1. 函数中声明静态局部变量当函数需要保留先前状态时,可以使用静态局部变量。
例如:Function Count() As IntegerStatic i As Integeri = i + 1Count = iEnd Function此函数被调用多次后,每次返回的值都会递增1。
2. 函数中声明静态私有变量如果需要在多个函数之间共享数据,可以使用静态私有变量。
例如:Private Static count As IntegerFunction Increment() As Integercount = count + 1Increment = countEnd FunctionFunction Decrement() As Integercount = count - 1Decrement = countEnd Function这两个函数都可以访问count变量,它们的返回值会根据count的值而变化。
三、过程中使用Static1. 过程中声明静态局部变量与函数中使用Static相同,可以在过程中声明静态局部变量。
例如:Sub Count()Static i As Integeri = i + 1MsgBox "Count: " & iEnd Sub每次调用该过程后,i的值都会递增1。
静态变量static的用法一、概述静态变量是一种变量类型,在编程语言中广泛应用。
它具有特殊的作用和特点,可以用来存储和共享数据。
静态变量在程序运行之初就被分配内存,并在整个程序运行期间保持不变。
本文将详细探讨静态变量的用法及其特点。
二、静态变量的定义和声明静态变量是使用static关键字定义的变量。
静态变量可以在类中或者函数中声明和定义,具体取决于其使用范围的需求。
类中的静态变量在类中声明的静态变量是类的成员,所有此类的对象都会共享这个静态变量。
使用静态变量可以在多个对象之间共享数据,这在一些场景中非常有用。
public class MyClass {static int count;}以上代码中,count是MyClass类的一个静态变量,所有MyClass的对象都可以读取和修改这个变量。
函数中的静态变量在函数中定义的静态变量仅在函数内部可见,但是它的生命周期延长至整个程序运行期间。
函数中的静态变量只会被初始化一次,即在第一次调用函数时。
void myFunction() {static int num = 0;num++;System.out.println("变量num的值为:" + num);}以上代码中,num是函数myFunction()中的一个静态变量,它在每次调用函数时都会自增并打印出来。
三、静态变量的特点和优势静态变量具有以下几个特点和优势:1. 共享数据静态变量在多个对象之间共享数据。
这意味着所有对象可以访问和修改同一个静态变量,从而达到数据的共享和统一管理。
2. 生命周期长静态变量的生命周期从程序开始到结束。
它在程序启动时被初始化,在整个程序运行期间可以被多次访问和修改,直到程序结束时才被释放。
3. 可以直接访问静态变量可以直接通过类名访问,无需创建对象。
这样可以方便地使用静态变量,而无需创建对象实例。
4. 方便管理全局数据静态变量可以作为全局数据的容器,在程序中存储一些全局配置或者状态信息。
类的static,const,static const , const static成员的初始化1.类里的const成员初始化:在一个类里建立一个const时,不能给它初值。
像class foo{private:const int i = 100;public:foo(){}......};这样的初始化方式是不能通过编译的,因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。
这意味着对于类里的常数表达式来说,const就像它在C中一样没有作用。
因此这个初始化工作必须发生在构造函数里,并且,要在构造函数的某个特别的地方。
因为const必须在建立它的地方被初始化,所以在构造函数的主体里,const必须已初始化了,否则,就只有等待,直到在构造函数主体以后的某个地方给它初始化,这意味着过一会儿才给const初始化。
当然,无法防止在在构造函数主体的不同地方改变const的值。
构造函数初始化表达式class foo{private:const int i = 100;public:foo(){......}......};如果构造函数是在类外定义,则可以这样写:class foo{private:const int i;public:foo();......};foo::foo(): i(100){......}2.类里的static成员初始化:类中的static变量是属于类的,而不是属于某个对象,它在整个程序的运行过程中只有一个副本,因此不能在定义对象时对变量初始化,就是不能用构造函数来初始化。
其正确的初始化方式是:<数据类型><类名>::<静态数据成员名>=<值> ,例如class foo{private:const int i;public:foo();......};int foo::i=100;这表明:(1)初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
Java中static静态变量的初始化完全解析静态变量初始化顺序1.简单规则⾸先先看⼀段最普遍的JAVA代码:123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21public class Test{public static Test1 t = new Test1(); public static int a = 0;public static int b;public static void main(String[] arg) {System.out.println(Test.a);System.out.println(Test.b);}}class Test1{public Test1(){Test.a++;Test.b++;}}这⾥先猜下控制台输出结果是什么?OK, 或许你已经猜到下⾯了结果了,那么你还是熟悉Java的。
复制代码代码如下:0 1如果你不明⽩是为什么会输出上⾯的结果,那么我来告诉你。
Java静态变量初始化遵循以下规则:静态变量会按照声明的顺序先依次声明并设置为该类型的默认值,但不赋值为初始化的值。
声明完毕后,再按声明的顺序依次设置为初始化的值,如果没有初始化的值就跳过。
看了这个就会明⽩,原来Test.a的值变化了三次。
声明时设置为0>>Test1::Test1⾥设置为1>>Test.a初始化为02.复杂规则明⽩了这个,请再看下⾯的代码。
1234567 8 9 10 11 12 13public class A{public static int b = B.a;public static A plus =new A("A");public static final int finalInt = (int)(Math.random()*100); public static B p = new B("A");public static final String finalStr = "finalStr";14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 public static final Integer finalInteger = new Integer(10); public static int a = 1;public static B c = null;public A(String from){System.out.println("----------- begin A::A ----------------");System.out.println("A::A, from="+from);System.out.println("A::A, A.b="+A.b);System.out.println("A::A, A.finalInt="+A.finalInt);System.out.println("A::A, B.a="+B.a);System.out.println("A::A, B.plus="+B.plus);System.out.println("----------- end A::A ----------------");}public static void main(String[] arg){System.out.println("main, A.b="+A.b);System.out.println("main, B.t="+B.t);System.out.println("main, C.a="+C.a);}}class B{public static int t = A.a;public static A plus = new A("B");public static int a = 1;public B(String from){System.out.println("----------- begin B::B ----------------");System.out.println("B::B, from="+from);System.out.println("B::B, B.a="+B.a);System.out.println("B::B, A.a="+A.a);System.out.println("B::B, A.p="+A.p);System.out.println("B::B, A.plus="+A.plus);System.out.println("B::B, A.finalInt="+A.finalInt);System.out.println("B::B, A.finalInteger="+A.finalInteger); System.out.println("B::B, A.finalStr="+A.finalStr);System.out.println("----------- end B::B ----------------");}}class C{public static final A a = new A("C");}这个你还能猜到输出结果吗? 我是在⼀边测试⼀边写的,所以我没猜出来.哈哈控制台输出结果为:1234 5 6 7 8 9 10 11 12 13 14 15----------- begin A::A ----------------A::A, from=BA::A, A.b=0A::A, A.finalInt=0A::A, B.a=0A::A, B.plus=null----------- end A::A --------------------------- begin A::A ----------------A::A, from=AA::A, A.b=1A::A, A.finalInt=0A::A, B.a=1A::A, B.plus=A@a90653----------- end A::A ----------------16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34----------- begin B::B ----------------B::B, from=AB::B, B.a=1B::B, A.a=0B::B, A.p=nullB::B, A.plus=A@1fb8ee3 B::B, A.finalInt=61B::B, A.finalInteger=null B::B, A.finalStr=finalStr----------- end B::B ----------------main, A.b=1main, B.t=0----------- begin A::A ----------------A::A, from=CA::A, A.b=1A::A, A.finalInt=61A::A, B.a=1A::A, B.plus=A@a90653----------- end A::A ----------------main, C.a=A@61de33这个结果你没猜到吧,哈哈.要⼀句⼀句的讲解程序执⾏结果,还是要很到的篇幅的.这⾥就直接写出Java静态变量初始化遵循的规则了。
函数中的静态变量特定函数在C++中,静态变量是一种与特定函数关联的变量类型,它与普通变量不同的是,静态变量的存储位置在程序的生命周期内保持不变,即使在函数调用结束后也不会销毁。
静态变量还具有特定函数的作用域,只在特定函数内部可见,并且不同的函数之间的静态变量是相互独立的。
我们可以使用static关键字来定义静态变量。
1. 静态变量的定义在函数内部使用static关键字定义的变量被称为静态变量。
语法格式如下:return_type function_name(parameters) {static variable_type variable_name;// 函数体}其中,function_name是函数的名称,parameters是函数的参数列表,return_type 是函数的返回类型,variable_type是静态变量的数据类型,variable_name是静态变量的名称。
例如,下面的示例代码定义了一个名为countCalls的函数,其中使用了静态变量count:#include <iostream>void countCalls() {static int count = 0;count++;std::cout << "This function has been called " << count << " times." << st d::endl;}int main() {countCalls();countCalls();countCalls();return 0;}输出结果为:This function has been called 1 times.This function has been called 2 times.This function has been called 3 times.2. 静态变量的特点和用途静态变量具有以下几个特点:2.1 存储位置固定静态变量的存储位置在程序的生命周期内保持不变。
static变量与普通变量的异同
1、static局部变量与普通局部变量的异同
相同点:都是局部变量,在函数内部定义,仅能被该模块内部的语句所访问。
不同点:
1)内存分配与释放:
static修饰的局部变量在内存中存放在静态存储区,static修饰的局部变量只有在整个程序结束的时候才会⾃动释放。
若下次调⽤该局部变量所在的函数时,不需要对它重新声明,且会保留上⼀次调⽤存⼊的值。
普通局部变量存放在堆栈区,动态分配,其离开作⽤域‘{}’后,就会⾃动销毁,释放内存空间,⽆法再次使⽤此变量。
static局部变量在编译阶段,函数还未执⾏的时候,就已经分配了变量空间。
普通局部变量只有在执⾏到定义变量的语句时,才会分配内存空间。
2)初始化
static局部变量不初始化时,默认值为0;
普通局部变量不初始化时,默认值为随机值。
2:static全局变量与普通全局变量的异同
两者在存储⽅式上都是静态存储,这两者的区别在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。
⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
static静态变量和静态代码块的执⾏顺序众所周知在android中static 修饰的会被称之为静态常量,静态变量,静态⽅法,还有就是静态代码块,⽤static{ // 代码块⾮static修饰的⽅法,变量,常量,是不能再静态代码块中使⽤的 } 表⽰。
static修饰的是跟着类⾛的,⽽不是跟随对象,这个⼤家都是知道的。
那么⼤家是否知道它们之间的运⾏顺序的关系呢?今天,我就给⼤家简单讲解⼀下吧。
静态常量,静态变量,静态⽅法,⼤家都知道是通过类名直接调⽤的(例如:Demo.getStatic() )。
但是静态代码块⼤家都没有主动调⽤过对吧。
那它到底什么时候被执⾏呢?让我来揭晓吧,其实只要你的代码在任意地⽅,动⽤了静态代码块所属的类中的任意东西,那么该静态代码块就会马上执⾏(说⽩了就是静态代码块是这个类最先执⾏的代码,但前提是你要使⽤这个类,不使⽤的话,这个类中的静态代码块是不会执⾏的与静态变量相⽐就是看代码编写的前后顺序,和静态⽅法有很⼤的区别)。
当⼀个类中有多个静态代码块的时候,是按照代码编写的上下顺序先后执⾏的。
静态代码块与静态变量之间的关系:如果你想正确使⽤两者的话,个⼈建议你必须把静态变量定义在静态代码块的前⾯,因为两个的执⾏是会根据代码编写的顺序来决定的。
这个⽐较难理解,我来举个例⼦吧,情况下⾯代码:public class Demo{public static int i;static{i = 20;//这⾥的i,是可以被⽤作运算的。
}}这时候如果你在main函数输出i,那么i=20;public class Demo{static{i = 20;//这⾥的i,是不能被⽤作运算的,因为本质上 i 还未被定义}public static int i;}这时候如果你在main函数输出i,那么i=20;public class Demo{static{i = 20;//这⾥的i,是不能被⽤作运算的,因为本质上 i 还未被定义}public static int i = 1;}//但是如果我们给静态的i附上⼀个初始值后,那么结果就变了。
static静态变量的理解静态变量类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。
静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。
另外,属于静态存储方式的量不一定就是静态变量。
例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,而且它会保持最新的值。
说其静态,是因为它不会随着函数的调用和退出而发生变化。
即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
一、静态局部变量:1、 Static类内部变量同auto自动变量(即未加 Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。
倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。
换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。
公司为了记录我们都上了什么网,将网络改成需要使用代理才能上网。
具体表现就是上网前要输入账号和密码。
这样我们那些爬虫代码也要跟着改写了。
Uri target = new Uri(sUrl);
HttpWebRequest resquest = (HttpWebRequest)WebRequest.Create(target);
ProxySetting(resquest);
……
//设置代理
private static void ProxySetting(WebRequest request)
{
WebProxy proxy = WebProxy.GetDefaultProxy();//获取IE缺省设置
if (proxy.Address != null)//如果地址为空,则不需要代理服务器
{
try
{
string dm =
System.Configuration.ConfigurationManager.AppSettings["strDomain"];
string name =
System.Configuration.ConfigurationManager.AppSettings["strUserName"];
string pwd =
System.Configuration.ConfigurationManager.AppSettings["strPassWord"];
proxy.Credentials = new NetworkCredential( name,pwd,dm );
request.Proxy = proxy;
}
catch (Exception e)
{
throw e;
}
}
}
这样出来一个问题,就是每次抓取都要判断、读取、设置一下这个代理,对于爬虫这种多线程的程序来说,是很大的浪费,造成抓取时间大大延长。
能不能一次性设置好这个代理,然后每次抓取的时候,直接赋给这个WebRequest.Proxy呢?又或者有些网络环境根本不需要代理,那么就完全可以不去设置这个代理?
最简单的做法就是在调用方,先配置好这个代理,然后将这个proxy作为参数传进来(没有代理的环境,proxy == null),直接赋给WebRequest.Proxy。
但是这样的话,函数的参数就变了,会引起很多使用这个函数的地方都要修改,成本太高了。
并且将设置的工作丢给调用方,显得很不智能,万一调用这里不知道要设置这个代理呢?
还有个问题,我们抓取函数是静态函数,这意味着我们不能构造一个实例,在里面先初始化好一个Proxy成员变量,然后给抓取函数调用。
这也不行,那也不行,愁煞寡人。
十月革命一声炮响,后来想到静态变量。
将proxy作为静态变量,估计仅需初始化一次(就是第一次调用之时),以后在进程生命周期内,都无须再初始化了,可谓一次初始,无限调用。
//静态变量
static WebProxy _proxy = null;
//静态构造函数
static CSocket()
{
WebProxy proxy = WebProxy.GetDefaultProxy();//获取IE缺省设置
if (proxy.Address != null)
{
try
{
string dm =
System.Configuration.ConfigurationManager.AppSettings["strDomain"];
string name =
System.Configuration.ConfigurationManager.AppSettings["strUserName"];
string pwd =
System.Configuration.ConfigurationManager.AppSettings["strPassWord"];
proxy.Credentials = new NetworkCredential(name, pwd, dm);//从配置封装参数中创建
_proxy = proxy;
}
catch (Exception e)
{
}
}
}
//抓取函数
Uri target = new Uri(sUrl);
HttpWebRequest resquest = (HttpWebRequest)WebRequest.Create(target); resquest.Proxy = _proxy;。