静态数据成员
::是作用域操作符!
#include<iostream>
using namespace std;class Point{private:int x,y;public:point(int x = 0,int y = 0):x(x),y(y){}~point();int getX(){return x;}int getY(){return x;}
}
假设需要统计点的个数,考虑添加一个数据成员;
#include<iostream>
using namespace std;class Point{private:int x,y;int count;public:point(int x = 0,int y = 0):x(x),y(y){}~point();int getX(){return x;}int getY(){return x;}void addcount(){count++;}
}
这样非常的麻烦!所以我们采用静态属性
#include<iostream>
using namespace std;class Point{private:int x,y;static int count;public:point(int x = 0,int y = 0):x(x),y(y){}~point();int getX(){return x;}int getY(){return x;}void showCount(){cout<<count<<endl;}
}
int Point::count = 0;
突出一个共享;
#include<iostream>
using namespace std;class Point{private:int x,y;static int count;public:Point(int x = 0,int y = 0):x(x),y(y){count++;}~Point(){count--;};int getX(){return x;}int getY(){return x;}void showCount(){cout<<count<<endl;}
};
int Point::count = 0;
int main(){Point a(4,5);cout<<"PointA:"<<a.getX()<<","<<a.getY()<<endl;a.showCount();Point b;cout<<"PointB:"<<b.getX()<<","<<b.getY()<<endl;b.showCount();
}运行结果:
PointA:4,4
1
PointB:0,0
2
静态变量一般只用于“统计对象个数”这种必须多个对象共享的场合!
静态成员函数
#include<iostream>
using namespace std;class Point{private:int x,y;static int count;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 x;}static void showCount(){cout<<count<<endl;}//只能包含静态数据成员
};
int Point::count = 0;
int main(){Point a(4,5);cout<<"PointA:"<<a.getX()<<","<<a.getY()<<endl;Point::showCount();//类名称调用静态函数Point b;cout<<"PointB:"<<b.getX()<<","<<b.getY()<<endl;Point::showCount();
}
思考:为什么在静态函数中只能包含静态变量?
复制构造函数,如果你没有创建,系统会自动为你创建
作业
静态数据成员存储在静态数据区,而不是每个对象的实例中
#include<iostream>
using namespace std;class Rectangle{private:int width, height;static int count;public:Rectangle();//无参构造函数Rectangle(int newwidth,int newheight);//有参构造函数~Rectangle();static void getCount(){cout<<"矩形个数:"<<count<<endl;}//内联函数,设置属性的值,一般只有这种很短的函数才可以写在定义中//this 表示的是当前对象的意思void setWidth(int width){this->width = width;}void setHeight(int height){this->height = height;}//获得属性的值int getWidth(){return width;}int getHeight(){return height;}int getArea(){int area = this->width * this->height;return area;}int getPerimeter(){int Perimeter = (this->width + this->height)*2;return Perimeter;}};int Rectangle::count = 0;Rectangle::Rectangle(){this->width = 1;this->height = 1;count++;
}
Rectangle::Rectangle(int newwidth,int newheight){this->width = newwidth;this->height = newheight;count++;
}
Rectangle::~Rectangle(){count--;
}int main(){Rectangle myRectangle1;cout<<"利用无参构造函数创建的时间对象"<<endl;int W1 = myRectangle1.getWidth();int H1 = myRectangle1.getHeight();int A1 = myRectangle1.getArea();int P1 = myRectangle1.getPerimeter();cout<<"矩形的长为:"<<W1<<endl<<"矩形的宽为:"<<H1<<endl<<"矩形的面积为:"<<A1<<endl<<"矩形的周长为:"<<P1<<endl;Rectangle::getCount();int W2,H2;cin>>W2>>H2;Rectangle myRectangle2(W2,H2);cout<<"利用有参构造函数创建的时间对象"<<endl;int A2 = myRectangle2.getArea();int P2 = myRectangle2.getPerimeter();cout<<"矩形的长为:"<<W2<<endl<<"矩形的宽为:"<<H2<<endl<<"矩形的面积为:"<<A2<<endl<<"矩形的周长为:"<<P2<<endl;Rectangle::getCount();return 0;
}
//Rectangle.h
#ifndef RECTANGLE_H
#define RECTANGLE_H
class Rectangle{private:int width, height;static int count;public:Rectangle();//无参构造函数Rectangle(int newwidth,int newheight);//有参构造函数~Rectangle();static void getCount(){};//内联函数,设置属性的值,一般只有这种很短的函数才可以写在定义中//this 表示的是当前对象的意思void setWidth(int width);void setHeight(int height);//获得属性的值int getWidth();int getHeight();int getArea();int getPerimeter();
};#endif
//Rectangle.cpp
#include "Rectangle.h"
#include <iostream>
using namespace std;int Rectangle::count = 0;Rectangle::Rectangle(){this->width = 1;this->height = 1;count++;
}
Rectangle::Rectangle(int newwidth,int newheight){this->width = newwidth;this->height = newheight;count++;
}
Rectangle::~Rectangle(){count--;
}
void Rectangle::getCount(){cout<<"矩形个数:"<<count<<endl;}
void Rectangle::setWidth(int width){this->width = width;}
void Rectangle::setHeight(int height)
{this->height = height;}
//获得属性的值
int Rectangle::getWidth(){return width;}
int Rectangle::getHeight(){return height;}
int Rectangle::getArea()
{int area = this->width * this->height;return area;
}
int Rectangle::getPerimeter()
{int Perimeter = (this->width + this->height)*2;return Perimeter;
}
//job1.cpp
#include "Rectangle.h"
#include <iostream>
using namespace std;int main(){Rectangle myRectangle1;cout<<"利用无参构造函数创建的时间对象"<<endl;int W1 = myRectangle1.getWidth();int H1 = myRectangle1.getHeight();int A1 = myRectangle1.getArea();int P1 = myRectangle1.getPerimeter();cout<<"矩形的长为:"<<W1<<endl<<"矩形的宽为:"<<H1<<endl<<"矩形的面积为:"<<A1<<endl<<"矩形的周长为:"<<P1<<endl;Rectangle::getCount();int W2,H2;cin>>W2>>H2;Rectangle myRectangle2(W2,H2);cout<<"利用有参构造函数创建的时间对象"<<endl;int A2 = myRectangle2.getArea();int P2 = myRectangle2.getPerimeter();cout<<"矩形的长为:"<<W2<<endl<<"矩形的宽为:"<<H2<<endl<<"矩形的面积为:"<<A2<<endl<<"矩形的周长为:"<<P2<<endl;Rectangle::getCount();return 0;
}