1、C+静态成员变量和静态成员函数数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入 static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.非静态成员:所有没有加 Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问非静态成员的生存期决定于该类的生存期而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非
2、静态构造函数分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明 static在类中的作用。一、在面向过程设计中的 static关键字1、静态全局变量定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。特点:A、该变量在全局数据区分配内存。B、初始化:如果不显式初始化,那么将被隐式初始化为 0(自动变量是随机的,除非显式地初始化)。C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。例(摘于 C+程序设计教程-钱能主编 P103): /file1.cpp/Example 1#include
3、 void fn();static int n; /定义静态全局变量void main()n=20;cout void fn();static int n; /定义静态全局变量(只能在本文件中使用)void main()n=20;cout extern int n;(可在别的文件中引用这个变量)void fn()n+;cout void fn();void main()fn();fn();fn();void fn()static n=10;cout static void fn();/声明静态函数void main()fn();void fn()/定义静态函数int n=10;cout cla
4、ss Myclasspublic: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 fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有 this指针。从这个意义上讲,它无法访问属于类对象的非静
5、态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。下面举个静态成员函数的例子。/Example 6#include class Myclasspublic: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 )为一个类的对象或指向类对象的指针调用静态成员函数,当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员变量只能被静态成员函数调用。 静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。