精华内容
下载资源
问答
  • 当将的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有... 静态成员变量不能在中初始,实际上的定义只是在描述对象的蓝图,在其中指定初值是允许的。也能在的构造...

        当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类的对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。

        静态成员变量不能在类中初始化,实际上类的定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化静态成员变量,因为静态成员变量为类的各个对象共享,否则每次创建一个类的对象则静态成员变量都要被重新初始化。

        从另外的角度考虑,静态成员变量不可在类体内进行赋值,因为它是被所有该类的对象所共享的,如果你在一个对象里给它赋值,其他对象里的该成员变量也会发生变化,因此,为了避免混乱,所以不可在类体内对静态成员变量进行赋值。

        静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。一般形式:

        数据类型类名::静态数据成员名=初值

        注意:不能用参数初始化表对静态成员初始化。如果不对静态成员变量进行显示的初始化,一般系统缺省初始为0。

        静态成员是类所有的对象的共享的成员,而不是某个对象的成员。它在对象中不占用存储空间,这个属性为整个类所共有,不属于任何一个具体对象。所以静态成员不能在类的内部初始化。静态成员变量的用途之一是统计有多少个对象实际存在,比如声明一个学生类,其中一个成员为学生总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。

    例如:

    #include "iostream"
    using namespace std;
    
    class test
    {
    private:
         int x;
         int y;
    public:
         static int num;
         static int Getnum()
         {
              //x+=5;   // 这行代码是错误的,静态成员函数不能调用非静态数据成员.
              num+=15;
              return num;
         }
    };
    
    int test::num = 10;
    
    int main(void)
    {
         test a;
         cout<<test::num<<endl;        //10
         test::num = 20;
         cout<<test::num<<endl;        //20
         cout<<test::Getnum()<<endl;   //35
         cout<<a.Getnum()<<endl;       //50
    
         return 0;
    }

        通过上例可知:x+=5; 这行代码是错误的。另外,静态成员函数在类外实现以及静态成员变量在类外初始化时无须加static关键字,否则是错误的。若在类的体外来实现上述的那个静态成员函数,不能加static关键字,这样写就可以了:

     int test::Getnum()
    
     {
    
           .........
    
     }

    1、static成员的所有者是类本身和对象,但是多个对象拥有一样的静态成员;

    2、静态成员变量不能在类定义里边初始化,只能在class body外初始化。

    3、静态成员仍然遵循public,private,protected访问准则。

    4、静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。

        静态成员函数可以直接访问该类的静态成员变量和静态成员函数,而不能直接访问类的非静态成员变量,如果一定要访问非静态成员变量则必须通过参数传递的方式得到一个对象名,然后通过对象名来访问。

    例如:

    class Myclass
    {
    private:
            int a,b,c;
            static int Sum;    //声明静态数据成员
    public:
            Myclass(int a,int b,int c);
            void GetSum();
    };
    
    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::GetSum()
    {
            cout <<"Sum=" <<Sum <<endl;
    }
    int main(void)
    {
            Myclass me(10,20,30);
            me.GetSum();
            
            return 0;
    }

    由上例可知,非静态成员函数Myclass(int a,int b,int c)和GetSum()都访问了静态数据成员Sum,非静态成员函数可以任意地访问静态成员函数和静态数据成员。但是,静态成员函数不能访问非静态成员函数和非静态数据成员。

    关于静态成员函数,可以总结为以下几点:
    1. 出现在类体外的函数定义不能指定关键字static;
    2. 静态成员之间可以相互访问,包括静态成员函数访问静态成员变量和访问静态成员函数;
    3. 非静态成员函数可以任意地访问静态成员函数和静态成员变量;
    4. 静态成员函数不能访问非静态成员函数和非静态成员变量;
    5. 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
    6. 调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,或者"类名::静态成员函数名"的方式调用;
    7. 当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。

    展开全文
  • 需要先实例化对象,用对象调用 静态只会执行调用一次,并且在程序退出之前会一直保持状态,占领内存 实例化一次调用一次 先执行静态方法 后执行实例方法 二、C#静态类和实例 .

    一、C#静态和实例概念

    静态概念:

    公共的、全局的、不属于个别实例的定义。

    加载时调用一次,占领内存,不会销毁。

    实例概念:

    new 出来的具体单个对象。

    随着作用域定义,使用,销毁(多数实例,通过垃圾回收机制自动销毁)。

    静态 实例
    关键字static修饰类或方法 不能使用static修饰类或方法
    修饰后类直接调用 需要先实例化对象,用对象调用
    静态只会执行调用一次,并且在程序退出之前会一直保持状态,占领内存 实例化一次调用一次
    先执行静态方法 后执行实例方法

     

    二、C#静态类和实例类

    静态类:

    1.全局公共封装类,使用 static class定义。

    2.使用方式:类名.属性 、类名.方法

    3.一般不为静态类,设置构造方法

    4.静态资源程序启动时就加载,即可使用

    常用的底层基础类库不少是静态类

    例如:Syste.Math

    实例类:

    1.最常用的面向对象编程的类 使用class 定义

    2.使用方式 需要 new 出对象后,才能使用。

      FileInfo file = new FileInfo(@"e://one.txt");

     

    三、C#静态成员和实例成员

    静态成员:

    1.静态成员是属于“类”的或者说属于所有对象共有的

    2.静态成员:静态属性,静态方法, 使用static 声明

    3.静态成员,从当前类中可以直接使用; 从其他类中,需要通过 类名.静态成员 使用。

    4.实例方法中可以访问静态成员,静态发放中不能直接访问实例成员。

     

    实例成员:

    1.需要 new 运算执行后才可使用

    2.实例成员,可以归垃圾回收机制销毁,可以自定义销毁

     

    举例说明静态成员使用:

    static void Test2()
    {
        //FileInfo file = new FileInfo(@"e://one.txt");
    
        Student stu1 = new Student();
        stu1.RealName = "张三";
    
        Student stu2 = new Student();
        stu2.RealName = "李四";
        Console.WriteLine($"系统中学生总数量:{Student.AllCount}");//打印2
    }
    
    public class Student
    {
        /// <summary>
        /// 学生总数量
        /// </summary>
        public static int AllCount { get; set; } = 0;
    
        public string RealName { get; set; }
        public Student()
        {
            //没创建一个对象就累计一下
            AllCount++;
        }
    }

     

     

    更多:

     C# 字符串格式化_C# 字符串格式化整理

     C# 字符串拼接整理_C#字符串拼接方式整理

    C# 项目结构整理_.Net 项目结构整理

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

    千次阅读 2015-11-29 20:28:41
    C++静态成员变量和静态成员函数 数据成员可以分静态变量、非静态变量两种.  静态成员:静态中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态...

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

    数据成员可以分静态变量、非静态变量两种. 

    静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 

    非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容
    一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数

    分两个方面来总结,第一方面主要是相对于面向过程而言,第二方面相对于面向对象而言 


    一、在面向过程设计中的static关键字 

    1、静态全局变量 

    定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。 

    特点: 
      A、该变量在全局数据区分配内存。 
      B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。 
      C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。 

      例(摘于C++程序设计教程---钱能主编P103):         //file1.cpp 
            //Example 1 

    <span style="font-size: 14px;">             </span><span style="font-size:18px;">   #include <iostream.h> 
                    void fn(); 
                    static int n; //定义静态全局变量 
                    void main() 
                    { 
                    n=20; 
                    cout < <n < <endl; 
                    fn(); 
                    } 
                    void fn() 
                    { 
                    n++; 
                    cout << n << endl; 
                    } </span>

     D、文件作用域下声明的const的常量默认为static存储类型。 

    静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图: 




      
    一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现,Example 1中的代码中将 

    static int n; //定义静态全局变量 
    改为: 
    int n; //定义全局变量程序照样正常运行。的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处: 

    静态全局变量不能被其它文件所用;(好像是区别extern的) 
    其它文件中可以定义相同名字的变量,不会发生冲突; 

    您可以将上述示例代码改为如下: 

    //Example 2 
    //File1 
    #include <iostream.h> 
    void fn(); 
    static int n; //定义静态全局变量(只能在本文件中使用) 
    void main() 

    n=20; 
    cout < <n < <endl; 
    fn(); 


    //File2 
    #include <iostream.h> 
    extern int n;(可在别的文件中引用这个变量) 
    void fn() 

    n++; 
    cout < <n < <endl; 
    }
    编译并运行Example 2,您就会发现上述代码可以分别通过编译,但link时出现错误。

    试着将 static int n; //定义静态全局变量 
    改为 
    int n; //定义全局变量 

    再次编译运行程序,细心体会全局变量和静态全局变量的区别。

    2、静态局部变量 定义:在局部变量前加上static关键字时,就定义了静态局部变量。我们先举一个静态局部变量的例子,如下://Example 3 
    <span style="font-size:18px;">#include <iostream.h> 
    void fn(); 
    void main() 
    { 
    fn(); 
    fn(); 
    fn(); 
    } 
    void fn() 
    { 
    static n=10; 
    cout < <n < <endl; 
    n++; 
    } </span>


      通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。 
      但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。 
      静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。 

    特点: 
      A、该变量在全局数据区分配内存。 
      B、初始化:如果不显式初始化,那么将被隐式初始化为0,以后的函数调用不再进行初始化。 
      C、它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或 语句块结束时,其作用域随之结束。

    3、静态函数(注意与类的静态成员函数区别) 定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。 
    特点:   
    A、静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。  

    静态函数的例子://Example 4 
    #include <iostream.h> 
    static void fn();//声明静态函数 
    void main() 

    fn(); 

    void fn()//定义静态函数 

    int n=10; 
    cout < <n < <endl; 
    }
    定义静态函数的好处:静态函数不能被其它文件所用; 
    其它文件中可以定义相同名字的函数,不会发生冲突;
     

    二、面向对象的static关键字(类中的static关键字) 


    1、静态数据成员 

    在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。
    先举一个静态数据成员的例子。 

    //Example 5 
    #include <iostream> 
    class Myclass 

    public: 
    Myclass(int a,int b,int c); 
    void GetSum(); 

    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::GetSum() 

    cout < <"Sum=" < <Sum < <endl; 


    void main() 

    Myclass M(1,2,3); 
    M.GetSum(); 
    Myclass N(4,5,6); 
    N.GetSum(); 
    M.GetSum(); 

    }
    结果为6 21 21可以看出,静态数据成员有以下特点: 

    对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新; 
    静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员; 
    静态数据成员和普通数据成员一样遵从public,protected,private访问规则; 
    因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它; 

    静态数据成员初始化与一般数据成员初始化不同。
    静态数据成员初始化的格式为: 
    <数据类型><类名>::<静态数据成员名>=<值> 
    类的静态数据成员有两种访问形式: 
    <类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名> 

    如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ; 
    静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。
    这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。
    第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;
    同全局变量相比,使用静态数据成员有两个优势:
     
    静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性; 
    可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能; 

    2、静态成员函数 

      与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。
    但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
    下面举个静态成员函数的例子。 

    //Example 6 
    #include <iostream.h> 
    class Myclass 

    public: 
    Myclass(int a,int b,int c); 
    static void GetSum();/声明静态成员函数 
    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::GetSum() //静态成员函数的实现 

    // cout < <a < <endl; //错误代码,a是非静态数据成员 静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
    cout < <"Sum=" < <Sum < <endl; 


    void main() 

    Myclass M(1,2,3); 
    M.GetSum(); 
    Myclass N(4,5,6); 
    N.GetSum(); 
    Myclass::GetSum(); 


    关于静态成员函数,可以总结为以下几点: 


    出现在类体外的函数定义不能指定关键字static; 
    静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数; 
    非静态成员函数可以任意地访问静态成员函数和静态数据成员; 
    静态成员函数不能访问非静态成员函数和非静态数据成员; 
    由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长; 
    调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数.
    展开全文
  • 属性名 就调用(也只能这样调用),而非静态成员变量的值是各个实例私有的,所以调用的时候必须是先有具体的实例,然后通过实例名来调用。也就是说,static修饰的成员,大家用的时候都用的一个东西,一个人...

    静态成员变量值是所有类的实例共享的,所以调用的时候只需要  类名.属性名  就可调用(也只能这样调用),而非静态成员变量的值是各个实例私有的,所以调用的时候必须是先有具体的类的实例,然后通过实例名来调用。也就是说,static修饰的成员,大家用的时候都用的一个东西,一个人改动后,大家的都变了。而非static 修饰的成员是个人私有的,允许自己修改,每个人的都不一样。

    所以在编码中,我们一般为static 变量加一个final,就是为了变量的一致性,不允许某个实例对它进行修改。这也解释了为什么不能在静态的方法中调用非静态的成员(变量或方法),因为静态方法不需要实例化就可调用,如果此时调用非静态的成员,不能确定类是否已被实例化,被调用的成员是否存在(静态成员是在类被实例化,创建具体对象时才分配空间)。

    而静态成员在类加载完成的时候就已经分配完空间,所以实际存在,可以被static方法调用。

     

    从生命周期上看:

    静态成员:  在类加载的时候,类加载完成,就分配完空间;直到类被卸载时空间被回收

     非静态成员: 创建对象的时候分配空间; 对象变为垃圾空间被回收的时候被销毁

    展开全文
  • 体由2部分构成: 一部分是变量的定义; 一部分是方法的定义(一个中可以有多个方法) ...在变量定义部分定义的变量叫做成员变量,成员变量在...成员变量又分为实例变量和变量(static静态变量). class One {
  • C++类静态成员类静态成员函数    当将的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有中每一个普通数据成员的副本,但静态数据成员只有...
  • //成员变量(字段)、实例变量(表示该Id变量既属于成员变量又属于实例变量) private String name;//成员变量(字段)、实例变量 public int age;//成员变量(字段)、实例变量(这里用来举例子,在实际中一般都会设置为...
  • 静态成员变量

    千次阅读 2012-03-22 10:42:21
    在C++中(以及其他一些语言,如 C#,Java 等面向对象的语言中)的成员变量被声明为static(称为静态成员变量),意味着它为该的所有实例所共享,也就是说当某个实例修改了该静态成员变量,其修改值为该的...
  • 文章目录静态成员变量与静态成员函数的特点静态成员变量示例代码typeid运算符静态成员函数示例代码this指针访问权限 静态成员变量与静态成员函数的特点 在中以static 修饰的变量以及函数称为静态成员变量...
  • 可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问中静态的成员. ...
  • C++静态成员变量和静态成员函数使用总结

    万次阅读 多人点赞 2016-05-16 09:11:58
    C++静态成员变量和静态成员函数使用总结: 一.静态成员变量:   体中的数据成员的声明前加上static关键字,该数据成员就成为了该的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/...
  • // 定义静态成员变量 public void call() { // 定义成员方法 System.out.println("调用call()方法"); for (i = 0; i &lt; 3; i++) { System.out.print(i + " "...
  • C++类静态成员类静态成员函数    当将的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有中每一个普通数据成员的副本,但静态数据成员只有一个...
  • 体由2部分构成: <br />一部分是变量的定义; 一部分是方法的定义...局部变量只在定义它的方法中有效. <br />成员变量又分为 实例变量 和 变量(static静态变量). <br />cl
  • 静态成员变量

    千次阅读 2010-02-03 09:24:00
    内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元...
  • 最近复习C++的一些知识,遇到了一个我比较容易混淆、傻傻分清的知识点,那就是C++的变量的类型初始或赋初值,大致有普通成员变量、静态成员变量、成员常量这三种,还有一种组合的静态成员常量。 看到这几种数据...
  • 静态变量与const常量成员的初始
  • 静态成员函数调用非静态成员变量

    千次阅读 2012-12-27 13:19:47
    静态成员变量和方法)属于的对象,所以只有在的对象产生(创建实例)时才会分配内存,然后通过的对象(实例)去访问。 在一个静态成员中去访问其非静态成员之所以会出错是因为在的非静态成员不...
  • 原因:因为静态成员函数在对象构造时没有分配this指针(非静态成员函数则具有this指针),相当于是全局函数,是属于的,而成员变量只有对象(实例)能够访问,成员变量只有实例化才有意义。 解决办法:...
  • 静态成员变量和静态成员函数(static)

    千次阅读 2008-08-05 12:25:00
    静态成员变量和静态成员函数(static) 数据成员可以分静态变量、非静态变量两种. 静态成员:静态中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非...
  • 名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静 态成员可以直接访问中静态的成员. 非成静态员:所有没有加...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,433
精华内容 69,373
关键字:

不可实例化的类静态成员变量