C语言日记 38 类的静态成员

(3):友元类

例8-16 友元类

源程序:

#include <iostream>
using namespace std;
class Address;//提前声明 Address 类
class Student//声明 Student 类
{
public:
	Student(char* name, int age, float score);
public:
	void show(Address* addr);
private:
	char* m_name;
	int m_age;
	float m_score;
};
class Address//声明Address类
{
public:
	Address(char* province, char* city, char* district);
public:
	friend class Student;//将Student 类声明为Address类的友元类private:
	char* m_province;//省份
	char* m_city;//城市
	char* m_district;//区(市区)
};
//实现Student 类
Student::Student(char* name, int age, float score) :
	m_name(name), m_age(age), m_score(score) { }
void Student::show(Address* addr)
{
	cout << m_name << "的年龄是" << m_age << ",成绩是" << m_score << endl;
	cout << "家庭住址:" << addr->m_province << "省" << addr->m_city <<
		"市" << addr->m_district << "区" << endl;
};
//实现 Address 类
Address::Address(char* province, char* city, char* district)
{
	m_province = province;
	m_city = city;
	m_district = district;
}
int main()
{
	Student stu("小明", 16, 95.5f);
	Address addr("湖南", "衡阳", "衡阳师范学院");
	stu.show(&addr);
	Student* pstu = new Student("李刚", 16, 80.5);
	Address* paddr = new Address("河北", "衡水", "桃城");
	pstu->show(paddr);
	return 0;
}

vs2019: 

将char改为string(结果)也一样:

#include <iostream>
using namespace std;
class Address;//提前声明 Address 类
class Student//声明 Student 类
{
public:
	Student(string* name, int age, float score);
public:
	void show(Address* addr);
private:
	string* m_name;
	int m_age;
	float m_score;
};
class Address//声明Address类
{
public:
	Address(string* province, string* city, string* district);
public:
	friend class Student;//将Student 类声明为Address类的友元类private:
	string* m_province;//省份
	string* m_city;//城市
	string* m_district;//区(市区)
};
//实现Student 类
Student::Student(string* name, int age, float score) :
	m_name(name), m_age(age), m_score(score) { }
void Student::show(Address* addr)
{
	cout << m_name << "的年龄是" << m_age << ",成绩是" << m_score << endl;
	cout << "家庭住址:" << addr->m_province << "省" << addr->m_city <<
		"市" << addr->m_district << "区" << endl;
};
//实现 Address 类
Address::Address(string* province, string* city, string* district)
{
	m_province = province;
	m_city = city;
	m_district = district;
}
int main()
{
	Student stu("小明", 16, 95.5f);
	Address addr("湖南", "衡阳", "衡阳师范学院");
	stu.show(&addr);
	Student* pstu = new Student("李刚", 16, 80.5);
	Address* paddr = new Address("河北", "衡水", "桃城");
	pstu->show(paddr);
	return 0;
}

但是,vs2010:

 So...

类的静态成员

例8-17 具有静态数据成员的学生类

源程序:

#include <iostream>
using namespace std;
class Student//学生类的声明
{
public:
	Student(int nID)//构造函数
	{
		m_nID = nID; m_nCount++;
	}
	Student(Student& s);//拷贝构造函数
	int GetID()
	{
		return m_nID;
	}
	void GetCount()
	{
		cout << "学生人数:" << m_nCount << endl;
	}//输出静态数据成员private:
private:
	int m_nID;
	static int m_nCount;//静态数据成员的说明
};
Student::Student(Student& s)
{
	m_nID = s.m_nID;
	m_nCount++;
}
int Student::m_nCount = 0;//静态数据成员的初始化
void main()
{
	Student A(1001);//定义对象 A
	cout << "学生 A," << A.GetID() << endl;//输出此时学生个数
	A.GetCount();
	Student B(A);//定义对象 B,并用 A 初始化 B
	cout << "学生 B," << B.GetID() << endl;
	B.GetCount();//输出此时学生个数
	A.GetCount();//输出此时学生个数
}

结果:

书P147:修改例8-17中的主函数如下:

void main()
{
	Student::GetCount();
	//输出学生个数的初值
	Student A(1001);
	cout << "学生A," << A.GetID() << endl;
		A.GetCount();
	Student B(A);
	cout << "学生 B," << B.GetID() << endl;
	B.GetCount();
	A.GetCount();
}

结果:

m_nCount 是静态数据成员,而GetCount()函数是普通成员函数,

对普通函数成员的调用必须通过对象名

要想实现上述功能,就要用到静态成员函数

例8-18 具有静态数据和函数成员的学生类。

源程序:

#include <iostream>
using namespace std;
class Student
{
public:
	Student(int nID)		//构造函数
	{
		m_nID = nID; m_nCount++;
	}
	Student(Student& s);	//拷贝构造函数
	int GetID()
	{
		return m_nID;
	}
	static void GetCount()
	{
		cout << "学生人数:" << m_nCount << endl;
	}//静态成员函数,输出静态数据成员		
private://静态数据成员的说明
	int m_nID;
	static int m_nCount;
};
Student::Student(Student& s)
{
	m_nID = s.m_nID;
	m_nCount++;
}
int Student::m_nCount = 0;//静态数据成员的初始化
void main()
{
	Student::GetCount();//通过类名调用静态成员函数,输出初值
	Student A(1001);//定义对象A
	cout << "学生A," << A.GetID();
	A.GetCount();//输出此时学生个数
	Student B(A);//定义对象 B,并用 A初始化 B
	cout << "学生B," << B.GetID();
	B.GetCount();	//输出此时学生个数
	Student::GetCount();		//通过类名调用静态成员函数,输出学生个数
}

 结果:

例8-18和例8-17的区别,只有一个:

把成员函数GetCount()定义为私有成员函数;
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值