首页 > 编程笔记

C++ static静态成员变量和成员函数

类中的成员变量,在某些时候被多个类的对象共享,实现对象行为的协调作用。共享数据通过 static 实现,用 static 修饰成员后,创建的对象都共享一个静态成员。

例如,设计学生类时,可以定义一个成员变量用于统计学生的总人数,由于总人数应该只有一个有效值,因此完全不必在每个学生对象中都定义一个成员变量表示学生总人数,而是在对象以外的空间定义一个表示总人数的成员变量让所有对象共享。这个表示总人数的成员变量就可以使用 static 关键字修饰。

static 既可以修饰类的成员变量,也可以修饰类的成员函数,下面分别对这两种情况进行讲解。

1) static修饰成员变量

static 修饰的静态成员变量只能在类内部定义,在类外部初始化。

静态成员变量在调用时,可以通过对象和类进行访问。由于 static 成员变量存储在类的外部,计算类的大小时不包含在内。

【示例1】通过案例演示 static 关键字修饰类的成员变量,C++ 代码如下:
#include<iostream>
using namespace std;
class Student            //定义学生类Student
{
public:
    Student(string name);    //声明有参构造函数
    ~Student();      //声明析构函数
    static int _sum;     //声明表示学生总数的静态成员变量
private:
    string _name;       //声明表示学生姓名的成员变量
};
//类外实现Student类有参构造函数
Student::Student(string name)
{
   this->_name=name;
   _sum++;   
}
Student::~Student(){}     //类外实现析构函数
int Student::_sum = 0;     //类外初始化静态成员变量_sum
int main()
{
    Student stu1("张三");
    Student stu2("李四");
    cout<<"人数是:"<<stu1._sum<<endl;   //通过对象访问静态成员变量
    cout<<"人数是:"<<stu2._sum<<endl;
    cout<<"人数是"<<Student::_sum<<endl; //通过类访问静态成员变量
    cout<<"stu1的大小是:"<<sizeof(stu1)<<endl;
    return 0;
}
运行结果:

人数是:2
人数是:2
人数是2
stu1的大小是:8

示例分析:

2) static修饰成员函数

类中定义的普通函数只能通过对象调用,无法使用类调用。使用 static 修饰的成员函数,同静态成员变量一样,可以通过对象或类调用。

静态成员函数可以直接访问类中的静态成员变量和静态成员函数,对外提供了访问接口,实现了静态成员变量的管理。需要注意的是,静态成员函数属于类,不属于对象,没有 this 指针。

【示例2】通过案例演示 static 关键字修饰类的成员函数,C++ 代码如下:
#include<iostream>
#include<math.h>
using namespace std;
class Point         //定义坐标点类Point
{
public:
    Point(float x,float y);
    ~Point();
    static float getLen(Point& p1,Point& p2);    //声明静态成员函数
    static float _len;        //声明静态成员变量_len
private:
    float _x;
    float _y;
};
float Point::_len=0;
Point::Point(float x=0,float y=0):_x(x),_y(y)    //类外实现有参构造函数
{
    cout<<"初始化坐标点"<<endl;
}
Point::~Point(){}
float Point::getLen(Point &p1,Point &p2)     //类外实现有参构造函数
{
    float x=abs(p1._x-p2._x);
    float y=abs(p1._y-p2._y);
    _len=sqrtf(x*x+y*y);
    return _len;
}
int main()
{
    Point p1(1,2);
    Point p2(6,8);
    cout<<Point::getLen(p1,p2)<<endl;
    return 0;
}
运行结果:

初始化坐标点
初始化坐标点
7.81025

示例分析:

多学一招:static conts 修饰符组合修饰类成员

使用 static const 修饰符组合修饰类成员,既实现了数据共享又达到了数据不被改变的目的。

此时,修饰成员函数与修饰普通函数格式一样,修饰成员变量必须在类的内部进行初始化。示例如下:

class Point
{
public:
    const static float getLen();
private:
    const static float area;
};
const float area=3600;

优秀文章