类中静态成员与友元

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 
时间: 2024-08-28 08:20:50

类中静态成员与友元的相关文章

static 类中的静态成员,组合类,友元函数 ,内部类

static 表示静态的意思 在c++中有两种表示 ,静态成员变量和静态成员函数 一个类中的静态成员只属于当前类,不属于某个对象.一个类的静态成员只有一份由当前类所有,每个对象都可以访问静态成员,当然也可以通过类名来访问 这里推荐用类名::静态成员来访问 static 成员函数应该在所有的成员函数之外初始化 如果不初始化系统默认为0 static 成员函数只能访问static成员 static成员函数  ,函数体内不能使用this指针 在我前前面已经说过组合类的概念了,今天我再介绍两个类,友元,

C++程序设计方法3:类中的静态成员

在类型前面加static修饰的数据成员,是隶属于类的,成为类的静态数据成员,也称为"类的变量" 静态数据成员被该类的所有对象共享(即所有对象中的这个数据域实际上处于同一个内存位置) 静态数据要在实现文件中赋初值,格式为: Type ClassName::static_var = Value; 返回值类型前面加static修饰的成员函数,称为静态成员函数,它们不能调用非静态成员函数: 类的静态成员(数据,函数)既可以通过对象来访问,也可以通过类名字类访问: #include <io

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

C++类中的静态成员变量与静态成员函数

最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员先于类的声明而存在于内存,也可以根据类声明的对象来访问.而非静态成员必须实例化之后才会分配内存. 非静态成员的概念: 所有没有加static的成员都是非静态成员.而类被实例化后,可以通过实例化的类

C++ 类中的静态成员变量,静态成员函数

//类中的静态成员变量,静态成员函数 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* 静态成员函数是属于整个类, static修饰的变量,是属于类,,所有的对象都能共享用. 在类的静态数据成员函数中,是不能调用具体的对象的变量的属性, 这是因为static修饰的变量是整个类共享,在静态成员函数中使用一个对象的成员属性 c++编译器无法知道这个成员属性是哪个对象的 所以在静态成员函数中只能使用静

静态成员函数为什么不能访问本类中的非静态成员?

和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volume( );实际上也允许通过对象名调用静态成员函数,如a.volume( );但这并不意味着此函数是属于对象a的,而只是用a的类型而已.静态成员函数的作用是为了能处理静态数据成员.可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针.由此

友元——友元可以访问与其有好友关系的类中的私有成员。 友元包括友元函数和友元类。

简介:友元可以访问与其有好友关系的类中的私有成员.    友元包括友元函数和友元类. [1]将普通函数声明为友元函数 #include<iostream> using namespace std; class Time { public: Time(int,int,int); friend void display(Time &);//定义友元函数 private: int hour; int minute; int sec; }; Time::Time(int h,int m,int

C++类中的静态成员变量与静态成员函数的使用

代码: 1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 5 using namespace std; 6 7 class A{ 8 public: 9 static int a; 10 //static int a = 0; //编译不通过,无法在类内初始化 11 int b; 12 static void func1(){ 13 cout<<"static func&

static 类中的静态成员

static 表示静态的意思 在c++中有两种表示 ,静态成员变量和静态成员函数 一个类中的静态成员只属于当前类,不属于某个对象.一个类的静态成员只有一份由当前类所有,每个对象都可以访问静态成员,当然也可以通过类名来访问 这里推荐用类名::静态成员来访问 static 成员函数应该在所有的成员函数之外初始化 如果不初始化系统默认为0 static 成员函数只能访问static成员 static成员函数  ,函数体内不能使用this指针