(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()定义为私有成员函数;
2719

被折叠的 条评论
为什么被折叠?



