静态数据成员
类是类型而不是详细的数据对象,类的对象都是该类的实例,每一个类对象都具有自己的数据成员,并且是相互独立,各占内存空间。然而,程序中往往须要让类的全部对象在类的范围内共享某个数据。声明为static的类成员可以在类的范围中共享,称之为静态成员。
一、全局变量与静态数据成员
希望在同类的多个对象之间实现数据共享,能够用静态的数据成员实现。
使用静态数据成员不会破坏隐藏的原则,即保证了安全性。
二、静态数据成员特点
在每一个类中仅仅有一个拷贝,由该类的全部对象共同维护和使用静态数据成员的值对每一个对象都是一样,但它的值是能够更新的。仅仅要对静态数据成员的值更新一次,保证全部对象存取更新后有同样的值。
三、静态数据成员的定义及初始化格式
static 类型标识符 静态数据成员名; //定义
类型标识符 类名:: 静态数据成员名 = 初始值;//初始化
说明:
(1)静态数据成员属于类全部的对象共同拥有,占一份内存空间。
(2)静态数据成员是静态存储的,它是静态生存期。它在程序開始编译时就分配空间,而不是某个对象创建时分配的。也不随对象的撤销而释放,而是程序结束才释放空间。
(3)初始化在类体外进行,并且前面不加static,以免与一般静态变量相混淆。
(4)初始化时不加该成员的訪问权限修饰符private,public等。
(5)初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
四、静态数据成员的訪问
类名 :: 静态数据成员名
Code:
类内.h定义:static int noofStds; //静态数据成员
.cpp中初始化:
int CStudent::noofStds = 0; //静态数据成员初始化
类内函数可直接引用,类外的普通函数引用时受訪问权限的限制,訪问方式为: CStudent::noofStds = x;
静态成员函数
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。
一、静态成员函数的定义格式
static 函数类型 静态成员函数名 ( 參数表 );
静态成员函数是在成员函数声明的前面加上keywordstatic。
二、调用静态成员函数使用例如以下格式
类名 :: 静态成员函数名 ( 參数表 );
三、静态成员函数的特点
(1) 对于公有的静态成员函数,能够通过类名或对象名来调用,而一般的非静态成员函数仅仅能通过对象名来调用。静态成员函数能够由类名通过符号“::”直接调用。
(2)静态成员函数能够直接訪问该类的静态数据成员和静态成员函数,不能直接问非静态数据成员和非静态成员函数。假设静态成员函数中要引用非静态成员时,可通过对象来引用。
Code2:
Cmystring为一个类,set_total_len为当中的静态成员函数,total_len为静态数据成员,len为普通成员。
方法一:通过传递对象的引用来确定非静态成员属于哪个类对象。
static int set_total_len( Cmystring str )
{
total_len+= str.len;
return total_len;
}
调用时:
Cmystring str1("this is the first string"); //
cout<<str1.set_total_len(str1)<<“\n”; //或
cout<<Cmystring::set_total_len(str1)<<”\n”;