统计一:按格式输出程序运行至当前存在过的Point对象总数。
(1)这种情况下一般要设置一个静态变量来进行统计,同时在每一个构造函数中对这个变量进行加一。
(2)构造函数包括拷贝构造函数、构造函数
例如:
#include <iostream>
using namespace std;
class Point
{
private:
double _x,_y;
static int id;
int now;
public:
Point():_x(0),_y(0){_id+=1;now=id;}//属于构造函数;这里++id
Point(double x):_x(x),_y(x){++_id;now=id;}//属于构造函数;
Point(double x,double y):_x(x),_y(y){++_id;now=id;}//属于构造函数;
Point(const Point &p):_x(p._x),_y(p._y){++_id;now=id;}//属于拷贝构造函数;
double getx(){return _x;}
double gety(){return _y;}
Point &setx(double x){ _x=x;return *this;}
Point &sety(double y){ _y=y;return *this;}
Point &setxy(double x,double y)
{
_x=x,_y=y;
return *this;
}
~Point(){}
static int getid(){return _id;}
Point& operator=(const Point &p)
{this->_x=p._x,_y=p._y;
return *this;
}
};
int Point::id=0;
这里虽然只需要统计一共出现过多少个该类的对象总数,但是在中途也会用到中间的数字,所以这个时候也要用一个普通的变量来进行赋值一遍直接输出这个时候用到 了多少个该类的对象。
统计二:按格式输出当前程序中Point对象的计数,同时要按格式输出程序运行至当前存在过的Point对象总数。
这种情况一般是除了计数总数的静态变量之外还要另外设一个 静态变量 a,因为在调用析构函数的时每析构一次a要减少一次,这个时候就不能把a看成普通变量让a=总数,要用另外一个重新计数,记录的是运行至当前存在过的类对象。
例如:
#include <iostream>
using namespace std;
class Point
{
private:
double _x,_y;
static int sum;
static int now;
public:
Point():_x(0),_y(0){sum+=1;now++;}
Point(double x):_x(x),_y(x){++sum;now++;}
Point(double x,double y):_x(x),_y(y){++sum;now++;}
Point(const Point &p):_x(p._x),_y(p._y){++sum;now++;}
double getx(){return _x;}
double gety(){return _y;}
Point &setx(double x){ _x=x;return *this;}
Point &sety(double y){ _y=y;return *this;}
Point &setxy(double x,double y)
{
_x=x,_y=y;
return *this;
}
~Point(){--now;}
static int getnow(){return now;}
Point& operator=(const Point &p)
{this->_x=p._x,_y=p._y;
return *this;
}
};
int Point::sum=0;
int Point::now=0;
统计三:对对象进行编号
如果要是想给一个对象一个编号的话,就要采用静态成员赋给一个常量的方法(注意析构的时候不要减少静态变量的数值,因为减少的话,后面的编号会与前面的相重合)
例如:
class Point
{
private:
double _a,_b;
static int sum;
int id;
public:
Point():_a(0),_b(0){++sum;id=sum;}
Point(double a,double b):_a(a),_b(b){++sum;id=sum;}
Point(const Point& p):_a(p._a),_b(p._b){++sum;id=sum;}
~Point(){}
};