第五章笔记---静态数据成员和静态成员函数
【背景】
面向对象的设计方法兼容数据的保护和共享,静态成员的提出是为了解决不同对象之间数据共享问题的。例如要统计人员个数,出现次数等等都需要用到静态处理。
【定义】
静态成员,指的是在c++类中声明成员时可以加上static关键字,这样声明的成员就叫做静态成员(包括静态数据成员和静态成员函数)。
静态数据成员
【声明格式】
static 数据类型 数据成员名;
【说明】
- 在c++中,静态数据成员是属于类的,一旦声明某个数据成员为静态数据成员,则该类的每个对象都可以访问它。
- 为什么使用静态数据成员而不是全局变量?--因为全局变量会带来不安全性,并且破坏了面向对象程序设计的信息隐蔽性和封装性的特点。
- 在一个类中,无论建立多少个对象,都只有一个是静态数据成员的拷贝,从而实现了一个类的不同对象之间的数据共享。
- 静态数据成员的初始化必须要在类外单独初始化,并且初始化要在定义对象之前。
数据类型 类名::静态数据成员名=初始值; 静态数据成员属于类,而不属于某个对象。
【代码验证】【书上5-4】
【解析】point具有静态数据成员count++,第一次调用时输出1,第二次调用时输出2
#include<iostream>
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--;
}
void getX() {
cout << x;
}
void getY() {
cout << y;
}
void showcount() {
cout << "count=" << count << endl;
}
private:
int x, y;
static int count;//声明静态数据成员
};
int point::count = 0;//用类名限定静态成员定义和初始化
int main() {
point a(1, 1);
a.showcount();
point b(a);
b.showcount();
return 0;
}
【运行截图】
静态函数成员
【声明格式】
static 返回类型 静态成员函数名 (实参表);
【调用格式】
类名::静态成员函数名(实参表); //----1
对象.静态成员函数名(实参表); //----2
对象指针->静态成员函数名(实参表);//----3
【说明】
- 静态成员函数属于类,不属于该类的某个对象,为该类所有对象共享
- 私有静态成员函数不能被类外部的函数和对象访问
- 使用静态成员函数的原因是可以用它在建立任何对象之前调用静态成员函数,从而对静态数据成员进行处理,但这一功能是普通成员函数所不能做到的。
- 静态成员函数与非静态成员函数的区别是:静态成员函数属于类,没有this指针,而非静态成员函数属于该类的某一对象,有指向该对象的this指针。
- 静态成员函数在类外可以直接通过类访问或者通过对象访问,而非静态成员函数在类外只能通过对象访问。
类名::静态成员函数名();//在类外直接访问静态成员函数
- 静态成员函数只能访问本类中的静态数据成员 vs 非静态成员函数可以访问本类中的静态数据成员与非静态数据成员。
【代码验证】【书上5-5】
【解析】
#include<iostream>
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 << "object count:"<<count;
}
private:
int x;
int y;
static int count;
};
int Point::count = 0;
int main() {
Point a(4, 5);
cout <<"Point a:"<< a.getX ()<< " " << a.getY()<<endl;
Point::showcount();
cout << endl;
Point b(a);
cout << "Point b:" << a.getX() << " " << a.getY() << endl;
Point::showcount();
return 0;
}
【运行截图】
【实际应用】
【题目描述】
请编写程序,计算出当日此商品的总销售款sum以及每件商品的平均售价。要求用静态数据成员和静态成员函数。
(提示: 将折扣discount,总销售款sum和商品销售总件数n声明为静态数据成员,再定义静态成员函数average(求平均售价)和display(输出结果)。
【代码】
#include
using namespace std;
class Product {
public: void set_value(); //设置商品的price和单次销售数量num
void total(); //计算总销售额sum和销售总量total_num
static void ave_count(); //计算平均商品价格
static void display(); // 显示sum,total_num和 average
private:
int num;
double price;
static double discount; //折扣
static int total_num; //总销量
static double sum; //总销售额
static double average; //平均价格
};
/数据初始化/
double Product::discount=0.98;
int Product::total_num=0;
double Product::sum=0;
double Product::average=0;
void Product::set_value(){
cout << "输入销量num和产品价格price:";
cin>>num>>price;
}
void Product::total(){
total_num+=num;
if(num>10)
sum+=numpricediscount;
else
sum+=num*price;
}
void Product::ave_count(){
average=sum/total_num;
}void Product::display(){
cout<<"num="<<total_num<<endl <<"sum="<<sum<<endl <<"average="<<average<<endl;
}
int main(){
const int t=3;
Product p[t];
for(int i=0;i<t;i++){
p[i].set_value();
p[i].total();
}
Product::ave_count();
Product::display();
return 0;
}
【运行截图】
