Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157848
  • 博文数量: 83
  • 博客积分: 3956
  • 博客等级: 中校
  • 技术积分: 663
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-24 16:29
文章分类

全部博文(83)

文章存档

2010年(83)

我的朋友

分类:

2010-10-25 16:39:12

  • 静态成员 

通常,每当说明一个对象时,把该类中的有关成员数据拷贝到该对象中,即同一类的不同对象,其成员数据之间是互相独立的。

当我们将类的某一个数据成员的存储类型指定为静态类型时,则由该类所产生的所有对象,其静态成员均共享一个存储空间,这个空间是在编译的时候分配的。换言之,在说明对象时,并不为静态类型的成员分配空间。

在类定义中,用关键字static修饰的数据成员称为静态数据成员。

有关静态数据成员的使用,说明以下几点:

1、类的静态数据成员是静态分配存储空间的,而其它成员是动态分配存储空间的(全局变量除外)。当类中没有定义静态数据成员时,在程序执行期间遇到说明类的对象时,才为对象的所有成员依次分配存储空间,这种存储空间的分配是动态的;而当类中定义了静态数据成员时,在编译时,就要为类的静态数据成员分配存储空间。

2、必须在文件作用域中,对静态数据成员作一次且只能作一次定义性说明。因为静态数据成员在定义性说明时已分配了存储空间,所以通过静态数据成员名前加上类名和作用域运算符,可直接引用静态数据成员。在C++中,静态变量缺省的初值为0,所以静态数据成员总有唯一的初值。当然,在对静态数据成员作定义性的说明时,也可以指定一个初值。


class A{
    int i,j;
    static int x,y;//定义静态成员

public: A(int a=0,int b=0,int c=0, int d=0){ i=a;j=b;x=c;y=d; }
    void Show(){cout << "i="<<i<<'\t'<<"j="<<j<<'\t';
                cout << "x="<<x<<'\t'<<"y="<<y<<"\n";
             }
};
int A::x=0; //必须对静态成员作一次定义性说明

int A::y=0;
void main(void )
{ A a(2,3,4,5);
    a.Show();
    A b(100,200,300,400);
    b.Show();
    a.Show();
}


3、静态数据成员具有全局变量和局部变量的一些特性。静态数据成员与全局变量一样都是静态分配存储空间的,但全局变量在程序中的任何位置都可以访 问它,而静态数据成员受到访问权限的约束。必须是public权限时,才可能在类外进行访问。

4、为了保持静态数据成员取值的一致性,通常在构造函数中不给静态数据成员置初值,而是在对静态数据成员的定义性说明时指定初值。


class A{    int i;
    static int count;
public:
    A(int a=0)
    { i=a; count++;
     cout <<"Number of Objects="<<count<<'\n';    }
    ~A()
    { count--; cout <<"Number of Objects="<<count<<'\n';    }
    void Show()
    { cout << "i="<<i<<'\n'; cout << "count="<<count<<"\n";}
};
int A::count;
void main(void )
{    A a1(100);
    A b[2];
    a1.Show();
}

待续………
阅读(273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~