类中静态成员与友元

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 


猜你喜欢

转载自blog.csdn.net/l15738519366/article/details/51333332