代码改变世界

C++第三次作业

2019-09-29 20:57  jormungandlalala  阅读(165)  评论(0编辑  收藏  举报

类的静态成员
一.静态数据成员:
(1)必须用关键字static声明
(2)为该类所有对象共享,静态数据成员具有静态生存期
(3) 必须在类外定义和初始化使用(::)指明所属的类
———代码分析(P155例5-4)

include

using namespace std;
class Point {
public:
Point(int x=0,int y=0 ) : x(x),y(y){
count++;
}
Point(Point &p)
{
x=p.x;
y=p.y;
count++;
}
~Point(){count--;
int getX(){return x;}
int getY(){return y;}
void showCount()
{
cout<<"The object count ="<<count<<endl;
}
private:
int x,y;
static int count;
};
int Point::count=0;
int main()
{
Point a(4,5);
cout<<"Point A:"<<a.getX()<<","<<a.getY();
a.showCount();
Point b(a);
cout<<"Point B:"<<b.getX()<<","<<b.getY();
b.showCount();
a.showCount();
return 0;
}
程序运行结果如下:

继续进行试验
(1)若不将点总数用static进行声明

此时通过运行截图可以看到程序出错,更加证明静态数据成员需要用stasic进行声明
(2)若不用类名初始化静态数据成员会如何

因为静态数据成员是类中所有对象共同的数据项所有定义是必须用类名
由上例可知,要知道总点数是必须调用函数showcount,并且需要用对象.函数,如a.showcount,但如果程序并没有声明对象,即总点数为零,该如何输出总点数呢?
二.静态函数成员
此时静态函数便可解决此问题

include

using namespace std;
class Point {
public:
Point(int x=0,int y=0 ) : x(x),y(y){
count++;
}
Point(Point &p)
{
x=p.x;
y=p.y;
count++;
}
~Point(){count--;}
int getX(){return x;}
int getY(){return y;}
static void showCount()
{
cout<<"The object count ="<<count<<endl;
}
private:
int x,y;
static int count;
};
int Point::count=0;
int main()
{
Point::showCount();
Point a(4,5);
cout<<"Point A:"<<a.getX()<<","<<a.getY();
Point::showCount();
Point b(a);
cout<<"Point B:"<<b.getX()<<","<<b.getY();
b.showCount();
Point::showCount();
return 0;
}

(1)写在public里的static声明的函数即是静态函数由静态数据成员的初始化必须用类名,不难知道调用静态函数必须用类名调用
(2)但从程序中可以看出静态函数也可以用 对象.静态函数名 调用,通过代码就能知道,静态函数可以直接访问该类的静态数据成员和函数成员,但访问非静态成员是、时,必须通过对象名。
例:
class A{
public:
static void f(A a);
private:
int x;
};
void A::f(A a)
{
cout<<x;
cout<<a.x;
}
上一种输出便是错误的,下一种便是正确的

      本节小结

(1)静态数据成员是类所有对象共有的数据项,当这个数据项被需求时,便用上述方式定义并使用
(2)静态函数成员就是用来处理静态数据成员的,掌握静态数据成员的定义并使用,静态函数成员便是大同小异