目录
概念:在C++类的定义中,不为某个对象独享,而是为类的所有对象所共享的数据叫做静态成员。
特点:不管这个类创建了多少个对象,其静态成员在内存中只保留一份拷贝,这个拷贝为该类的所有对象所共享。
类的静态成员:
(1)静态数据成员
(2)静态成员函数
一、静态数据成员
(1)静态成员的访问属性与普通数据成员一样。
(2)静态数据成员其存储空间是独立分配的,对静态成员的任何操作都将影响共享这一存储单元的所有对象。
(3)静态数据成员具有静态生存期。
(4)静态数据成员初始化时前面不加static关键字。
(5)静态数据成员是类的成员,初始化时必须使用类作用域运算符:: 限定他所属的类。
(6)静态数据成员的初始化与他的访问控制权限无关。
PS:静态数据成员的定义在类内声明,在类外初始化。
//Student类
class Student
{
private:
char * Sname;
int Sno;
static int Scount;
};
在类外对静态成员的初始化:
int Student :: Scount = 0;
在类外,通过类名和对象访问成员(在public 属性下)
Student S1;
S1.Scount ++; //error ,Scount存取属性为private
Student :: Scount++; //errror
二、静态成员函数
静态成员函数可以在类内定义,也可以在类内声明为static,在类外定义时,不能再使用static关键字。
静态成员函数调用方式:
(1)类名调用
(2)对象调用
PS:
a.通过对象调用静态成员函数的前提条件是对象已经建立。
b.访问权限与普通成员函数一样。
c.可以进行重载
静态成员函数与普通成员函数的区别:
(1)静态成员函数在类中只有一个拷贝,因此他访问对象的成员时要受到一些限制,静态成员函数可以直接访问类内说明的静态成员,不能直接访问类内的非静态成员;要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。
(2)静态成员函数没有this指针。
使用静态成员维护内存中Student类对象的个数(对象指针器)
//Student.h
#include<iostream>
#include<string.h>
using namespace std;
class Student
{
public:
static int GetCount()
{
return Scount;
}
Student(char * = "", int = 0);
Student(Student &);
~Student();
private:
char * Sname; //姓名
int Sno; //学号
static int Scount; //总人数
};
Student :: Student(char * name, int no)
{
this -> Sname = new char [strlen(name) + 1];
strcpy(this -> Sname,name);
this -> Sno = no;
++ Scount;
cout << "constructing :" << Sname << endl;
}
Student :: Student(Student & Stu)
{
Sname = new char [strlen(Stu.Sname) + 1];
strcpy(Sname,Stu.Sname);
Sno = Stu.Sno;
++ Scount;
cout << "&constructing:" << Stu.Sname << endl;
}
Student :: ~Student()
{
cout << "destructing:" << Sname << endl;
delete [] Sname;
-- Scount;
}
int Student :: Scount = 0;
//main.cpp
#include<iostream>
#include"Student.h"
using namespace std;
int main()
{
cout << Student :: GetCount() << endl;//使用类调用静态成员函数
Student s1 ("Antory");//建立一个新对象
cout << s1.GetCount() << endl;//通过对象调用静态成员函数
Student s2(s1);//利用已有的对象建立一个新对象
cout << s1.GetCount() << endl;
Student s3[2]; //建立一个对象数组
cout << Student :: GetCount() << endl;
Student * s4 = new Student [3];//建立一个动态对象数组
cout << Student :: GetCount() << endl;
delete [] s4; //删除动态对象组
cout << Student :: GetCount() << endl;
return 0;
}
运行截图: