c++友员,静态数据成员,常数据成员实验

实验目的:
(1)掌握在类内定义静态数据成员以实现共享的基本方法,并根据需要定义相应的静态成员函数专门操作静态数据成员;
(2)掌握类中常数据成员的定义及初始化方法,正确使用常数据成员;
(3)理解常成员函数的意义及常对象的意义,在程序中正确定义常对象,并正确调用相应的成员函数。
(4)掌握友元的定义和应用;
(5)掌握对象成员的定义和应用。
实验内容:
1、定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有数据成员,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。
(1)在Girl类中定义成员函数VisitBoy(Boy &),并声明为Boy类的友元成员,从而访问Boy类的私有成员。
(2)删除Girl类的成员函数VisitBoy(Boy &),定义一个普通函数 VisitBoyGirl(Boy &,Girl &),作为以上两个类的友元,通过调用该函数输出Boy和Girl的信息。
定义友元类的主函数可参考如下:
int main()
{ Girl girl(“ZHOU Yuxing”,16);
Boy boy(“Chen Qi”,15);
girl.Print();
boy.Print();
girl.VisitBoy(boy);
return 0;
}

定义友元函数的主函数可参考如下:
int main()
{ Girl girl(“ZHOU Yuxing”,16);
Boy boy(“Chen Qi”,15);
girl.Print();
boy.Print();
VisitBoyGirl(boy,girl);
return 0;
}

代码如下:
#include
using namespace std;
class Boy;
class Girl
{
private:
string name;
int age;
public:
Girl(string N, int A);
~Girl()
{
cout << “Girl的析构函数正在调用。” << endl;
}
void print();
void visitboy(Boy &boy);
};
class Boy
{
private:
string name;
int age;
public:
Boy(string N, int A);
~Boy()
{
cout << “Boy的析构函数正在调用。” << endl;
}
void print();
friend Girl;//声明Boy的友员,使得Girl也可以调用Boy的成员变量
};
Girl::Girl(string N, int A)
{
name = N;
age = A;
cout << “Girl的构造函数正在调用。” << endl;
}
void Girl::print()
{
cout << "Girl’s name is " << name< cout << “Girl’s age is” << age << endl;
}
void Girl::visitboy(Boy& boy)
{
cout << “通过Girl调用Boy。” << endl;
cout << "Boy’s name is " << boy.name << endl;
cout << “Boy’s age is” << boy.age << endl;
}
Boy::Boy(string N, int A)
{
name = N;
age = A;
cout << “Boy的构造函数正在调用。” << endl;
}
int main()
{
Girl girl(“zhouyun”, 16);
Boy boy(“chenqi”, 18);
girl.print();
girl.visitboy(boy);
return 0;
}
运行结果如下:

2、编写一个程序,定义一个Circle类,按下述内容要求定义相关的数据成员及成员函数,最后在主函数中输出各圆的半径及对应面积,并一次性输出平均面积。
(1)Circle类中定义4个数据成员:常数据成员PI代表圆周率,静态数据成员count用于统计圆对象的个数,普通的double型数据成员r代表圆的半径,普通的double型数据成员area代表圆面积,所有数据成员均为私有属性。再定义成员函数:构造函数、析构函数、用于输出圆的半径及面积的Print(),获取静态数据成员count的值的Count()函数。
(2)主函数中以一维对象数组定义若干个圆类的对象,输出每个圆的半径及对应面积,并且输出一次圆的个数。
(3)在Circle类中增加一个友元函数的声明,用来求所有圆面积的平均值,并实现该函数的代码,主函数中调用此函数,输出所有圆面积的平均值。
定义友元类的主函数可参考如下:
int main()
{ Circle c[5]={Circle(3),Circle(5),Circle(8),Circle(4),Circle(2)};
for(int i=0;i<5;i++)
{ cout<<“第”< c[i].Print();
}
cout<<“圆的个数为:”< cout<<“圆面积的平均值为:”< return 0;
}
代码如下:
#include
using namespace std;
class Circle
{
friend double average(Circle arr[], int length);//声明average函数是Circle类的友员使得average函数得以访问Circle类中的私有数据成员
private:
const double PI;//常数据成员的初始化必须在类–的构造函数–初始化列表中实现
static int count;//静态数据成员必须在类–外初始化
double r;
double area;
public:
Circle(double R):PI(3.14)
{
cout << “Cirle的构造函数正在调用。” << endl;
count++;
r = R;
area = PIrr;

}
~Circle()
{
	cout << "Cirle的析构函数正在调用。" << endl;
	count--;
}
void print()
{
	cout << "半径r为:" << r << endl;
	cout << "面积area为:" << area << endl;
}
int Count()
{
	return count;
}

};
int Circle::count = 0;
double average(Circle arr[], int length)
{
int i = 0;
double sum=0;
double average;
for (i = 0; i < length; i++)
{
sum = sum + arr[i].area;
}
average = sum / length;
return average;
}
int main()
{
Circle c[5] = { Circle(3),Circle(5),Circle(8),Circle(4),Circle(2)};
for (int i = 0; i < 5; i++)
{
cout << “第” << i + 1 << “个圆:”;
c[i].print();
}
cout << “圆的个数为:” << c[0].Count() << endl;
cout << “圆面积的平均值为:” << average(c, 5) << endl;
return 0;
}
运行结果如下:

3、根据下面的主函数,补充定义点类Point及相关函数,主要成员如下:
(1)两个double型私有数据成员x,y,分别表示横坐标和纵坐标。
(2)几个公有成员函数:
a.构造函数:带有默认值,横坐标/纵坐标的默认值均为0;
b.常成员函数GetX(),用来返回横坐标的值;
c.常成员函数GetY(),用来返回纵坐标的值;
d.成员函数Print(),用来输出普通点坐标;
e.常成员函数Print(),用来输出常对象点的坐标。
(3)定义友元函数Area,用来求以形式参数指定的两个点之间的长度为半径所得的圆面积。

主函数代码如下:
int main()
{
const Point p1(2,2);
Point p2(-5,3);
p1.Print();
p2.Print();
cout<<“s1=”< return 0;
}
代码如下:
#include
#include
using namespace std;
class point
{
friend double area(point p1, point p2);
private:
double x;//横坐标
double y;//纵坐标
const double PI;
public:
point(double X=0,double Y=0):PI(3.14)
{
x = X;
y = Y;
}
double GetX()
{
return x;
}
double GetY()
{
return y;
}
void print()
{
cout << “x的坐标值为:” << x << endl;
cout << “y的坐标值为:” << y << endl;
}
void print()const
{
cout << “x的坐标值为:” << x << endl;
cout << “y的坐标值为:” << y << endl;
}
};
double area(point p1, point p2)
{
double r;
double aera;
r = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
aera =p1. PI * r * r;
return aera;
}
int main()
{
const point p1(2, 2);
point p2(-5, 3);
p1.print();
p2.print();
cout << “s1=” << area(p1, p2) << endl;
return 0;
}
运行结果如下:

实验总结
1.静态数据成员需要在类内定义,必须要在内外初始化。(内外初始化时不用再加上static关键字)
例:int Student::total=0;
2.常数据成员需要在类内定义,必须要在构造函数的初始化列表中初始化。
例:

3.使用friend可以声明类的友员(友员函数,友员类),友员函数可以在其内部访问和使用friend类的private属性的数据成员。friend 声明的友员对象;
4.注意静态成员函数的返回类型为int。(不用加static关键字)
5.常成员函数的const的位置在函数参数列表后。(既不在前,也不在中间)
例:

6.可以直接根据类名访问静态数据成员(public),但在没有对象时不能根据成员函数去访问或者调用静态数据成员。

你可能感兴趣的:(c++)