8.11静态成员
使用关键字static。初始化静态成员数据必须在类外进行。
8.11.1静态成员数据
它是一个类的对象共享的数据成员,而不仅仅是某一对象的成员数据。例如班级名和班级人数就可以定义为学生类的静态成员数据。
它与一般成员数据的区别在于:对于静态成员数据,该类的每一个对象都共享唯一的数据,即它只存在一份拷贝;而对于一般成员数据,该类的每个对象都独立建立自己一个副本,以保存各自特定的值。
在Student类中定义静态成员数据int Student::count=0;当定义静态成员数据时不能同时进行初始化,如static int count=0是错误的。
8.11.2静态成员函数
它也称为类成员函数。
定义一个静态成员函数printCount(),在该函数中访问静态成员数据count。从类的外边访问公有静态成员数据,有两种形式:
对象名.公有静态成员函数;
类名::公有静态成员函数;
分别对应的代码为
stu.printCount();
Student::printCount();
类的内部的成员函数和成员数据相互访问的关系:
一般成员函数可以访问任何类型的函数和数据,而静态成员函数只可以访问静态成员函数和数据。
8.12友元
静态成员数据提供了在同一个类的所有对象之间共享的机制,而友元则是不同类的成员函数之间、类的成员函数和一般函数之间进行数据共享的机制。友元的引入破坏了类的数据封装性和隐蔽性,因此,在面向对象的程序设计方法中不提倡使用友元机制。
它可以定义在函数级别,也可以定义在函数类级别。
8.12.1友元函数
定义友元函数,使用关键字friend。一般函数printStudent()声明为类Student的友元函数,则该函数可以访问类Student的私有成员id,name&age ,方式为printStudent(stu),先声明一个对象Student stu(1,”li”,’F’);
8.12.2友元类
如果一个类的所有成员函数都需要声明为另一个类的友元函数,则友元函数的做法就显得繁琐。一个更为简单的做法就是声明为友元类,即将一个类声明为另一个类的友元函数。例如:
Class Administrator
{....};
Class Student
{
friend class Administrator;
};
例子:
#include<iostream>
#include<cstring>
using namespace std;
class Administrator
{
public:
void createStudent(int pId);
} ;
class Student{
public:
Student(int pId,char* pName,char pSex);
~Student();
friend void printStudent(Student& pStudent);
friend void Administrator::createStudent(int pId);
private:
int id;
char* name;
char sex;
};
void Administrator::createStudent(int pId)
{
Student stu(1,"wang",'M');
stu.id=pId;
// name=new char[strlen(pName)+1];
cout<<"id: "<<stu.id<<","<<"name: "<<stu.name<<","<<"sex: "<<stu.sex<<endl;
}
Student::Student(int pId,char* pName,char pSex)
{
cout<<"construct one student."<<endl;
id=pId;
sex=pSex;
name=new char[strlen(pName)+1];
if(name!=0)
strcpy(name,pName);
}
Student::~Student(){
cout<<"deconstuct one student."<<endl;
delete[] name;
}
void printStudent(Student& pStudent)
{
cout<<"id: "<<pStudent.id<<", "<<"name: "<<pStudent.name<<", "<<"sex: "<<pStudent.sex<<endl;
}
int main()
{
Student stu(1,"li",'F');
printStudent(stu);
Administrator admin;
admin.createStudent(2);
return 0;
}
//一般函数printStudent()声明为类Student的友元函数,则该函数可以访问类Student的私有成员id,name&age