静态变量和非静态变量

本文详细解析了C#中静态变量与非静态变量的概念、内存分配方式及值的共享特性,并通过示例代码说明两者的区别。

静态变量和非静态变量
c里面都是静态的.

c#里对于类里面的任何非静态成员,要用就必须有对象应用。
class   Person
{
      static   string   name;
               int   age;  

               String address;
}
main

        Person zhangsan =   new Person();
        zhangsan.age   = 20;     
        Person.name  =   zhangsan

        // zhangsan
是对象,而Person是类;

}  
   
  

理论部分:
.静态变量和非静态变量的基本概念

  
  
数据成员包括:静态变量和非静态变量两种

   A
静态变量:带有static 修饰符的变量称为静态变量。
   B
非表态变量:不带有static修饰符声明的变量称为实例变量。

. 两者的一些区别
     class test
     {
            static int b=0;        //
静态变量
            int a=0;                 //
非静态变量

     }
     1.
内存分配的区别:静态变量定义时就会存在于内存当中,直到它所在的类的程序运行结束之时它都将一直存在;而非静态变量需要被实例化后才会分配内存,它的存在周期取决于实例化的类的生存周期。

      
所以他们的调用方式也不相同:
      
静态变量:可以(只能)通过类本身.静态变量名,类的实例是不能调用的。

      
非静态变量: 当该变量所在的类被实例化后,可以通过实例化的类名来访问。
       (
另外静态成员不能访问非静态成员;非静态成员可以访问静态成员)
             test.b=2; //OK
             test t=new test();
             t.a=0;      //OK
             t.b=3 ;      //Error
编绎时会出错 无法使用实例引用访问静态成员test.test.b,改用类型名来限定它

     2. 两者值的共享问题: 静态变量被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值。非静态变量是不共享的。
        ex
:下面的最后的输出结果是:10,0
        class Class1
       {
        public static int cs1=0;
        public int cs3=0;
        }
        class Class2
       {
        public void a()
        {
            Console.WriteLine(Class1.cs1.ToString()); //
cs1是静态变量,所以当类Program修改cs1=10后,其它类的实例读到的值就是修改后的值10,所以此处输出的是:10
            Class1 cc = new Class1();
            Console.WriteLine(cc.cs3.ToString()); //
虽然类Program修改值cs3=34;但因cs3//class1类中是非静态变量,它的生存周期于实例化他的类的周期相同,所以当用类名ct实例结束后其
//
值也不会存在于内存当中,当此类用另一个类名cc来实例化后调用变量cs3,其值仍是非静态变量初始//化的值0.
        }
        }
        class Program
       {
         static void Main(string[] args)
        {
            Class1.cs1 = 10;
            Class1 ct = new Class1();
            ct.cs3 = 34;
            Class 2 cm = new Class2();
            cm.a();  
         }
       }

<think>嗯,用户想了解函数中静态变量静态变量的区别,以及它们的作用域行为分析。首先,我需要回忆一下相关的C/C++知识,尤其是静态变量局部变量的不同。根据之前提供的引用内容,静态局部变量普通局部变量在作用域、生命周期、存储位置等方面都有区别。 首先,作用域方面,静态局部变量普通局部变量都是在函数内部定义的,所以它们的作用域都是函数内部。这点可能用户容易混淆,以为静态变量会有更广的作用域,但根据引用[1],静态局部变量的作用域仍然在函数内部。不过它们的生命周期不同,静态变量的生命周期是整个程序运行期间,而普通局部变量只在函数调用时存在,调用结束就被销毁了。这一点需要重点强调。然后是存储位置,静态变量存储在静态存储区,而普通局部变量在栈区。这也解释了为什么静态变量生命周期长,因为静态存储区的变量在程序开始时就分配,直到程序结束才释放。而栈区的变量随着函数调用的结束而自动回收。 初始化方面,静态局部变量如果没有显式初始化,会被系统自动初始化为0或空字符,而普通局部变量如果不初始化,其值是未定义的,可能是随机的。这也是一个重要区别,用户可能在编程时遇到未初始化的问题,特别是静态变量自动初始化的特性需要注意。 另外,静态局部变量只能被初始化一次,即使多次调用函数,初始化语句也只执行一次。而普通局部变量每次函数调用都会重新初始化。这点可能在循环或递归中使用时有不同的表现,需要举例说明。 然后要考虑用户可能的实际应用场景,比如在函数中需要保持某个状态,或者统计函数被调用的次数,这时候静态变量常有用。而普通局部变量每次都是新的,适合临时存储数据。还要注意,静态局部变量普通局部变量的命名冲突问题,同一个函数内不能有同名的静态普通局部变量,引用[1]中提到这一点,需要提醒用户注意。另外,引用[2]中提到类的成员函数中的静态变量,所有对象共享同一份数据,这可能普通成员变量不同,但用户的问题是关于函数中的静态变量,所以可能不需要深入讨论类的成员,但如果有扩展问题的话可以提及。 总结一下,回答的结构应该分点说明区别,包括作用域、生命周期、存储位置、初始化、是否可重复初始化等,并给出示例代码帮助理解。同时,生成的相关问题需要围绕这些知识点,比如如何选择使用、初始化规则、应用场景等。</think>### 函数中静态变量静态变量的区别及作用域行为分析 #### 1. **作用域** - **静态局部变量**:作用域仅限定义它的函数内部[^1][^2]。例如: ```c++ void func() { static int s_count = 0; // 作用域仅在func函数内 } ``` - **静态局部变量**:作用域同样限于函数内部,但生命周期更短,仅在函数执行期间存在[^1][^4]。 #### 2. **生命周期** - **静态局部变量**:生命周期与程序运行周期一致。首次调用函数时初始化,之后保留其值直到程序结束[^1][^2]。例如: ```c++ void func() { static int s_count = 0; // 初始化仅一次 s_count++; } ``` - **静态局部变量**:生命周期仅限于函数调用期间,每次函数调用时重新创建,调用结束后销毁[^1][^4]。 #### 3. **存储位置** - **静态局部变量**:存储在静态存储区(全局/静态数据区)[^1][^4]。 - **静态局部变量**:存储在栈区[^1]。 #### 4. **初始化** - **静态局部变量**:未显式初始化时自动赋值为0(数值型)或空字符(字符型)[^1][^2]。例如: ```c++ static int s_num; // 自动初始化为0 ``` - **静态局部变量**:未初始化时值为随机垃圾数据[^1][^4]。 #### 5. **行为差异示例 ```c++ #include <iostream> using namespace std; void test() { static int s_val = 0; // 静态变量 int local_val = 0; // 静态变量 s_val++; local_val++; cout << "静态变量: " << s_val << ", 静态变量: " << local_val << endl; } int main() { test(); // 输出:静态变量:1, 静态变量:1 test(); // 输出:静态变量:2, 静态变量:1(静态变量每次重新初始化) return 0; } ``` #### 6. **关键区别总结** | 特性 | 静态局部变量 | 静态局部变量 | |--------------------|-------------------------|-------------------------| | **作用域** | 函数内部 | 函数内部 | | **生命周期** | 程序运行期间 | 函数调用期间 | | **存储位置** | 静态存储区 | 栈区 | | **初始化** | 自动初始化为0(若未显式) | 未初始化时为随机值 | | **多次调用是否保留值** | 是 | 否 | #### 7. **典型应用场景** - **静态变量**:统计函数调用次数、跨调用保留状态(如缓存)[^2]。 - **静态变量**:临时计算、函数内一次性使用数据。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值