C++ static静态成员变量和成员函数
类中的成员变量,在某些时候被多个类的对象共享,实现对象行为的协调作用。共享数据通过
例如,设计学生类时,可以定义一个成员变量用于统计学生的总人数,由于总人数应该只有一个有效值,因此完全不必在每个学生对象中都定义一个成员变量表示学生总人数,而是在对象以外的空间定义一个表示总人数的成员变量让所有对象共享。这个表示总人数的成员变量就可以使用
static 既可以修饰类的成员变量,也可以修饰类的成员函数,下面分别对这两种情况进行讲解。
静态成员变量在调用时,可以通过对象和类进行访问。由于 static 成员变量存储在类的外部,计算类的大小时不包含在内。
【示例1】通过案例演示 static 关键字修饰类的成员变量,C++ 代码如下:
静态成员函数可以直接访问类中的静态成员变量和静态成员函数,对外提供了访问接口,实现了静态成员变量的管理。需要注意的是,静态成员函数属于类,不属于对象,没有 this 指针。
【示例2】通过案例演示 static 关键字修饰类的成员函数,C++ 代码如下:
此时,修饰成员函数与修饰普通函数格式一样,修饰成员变量必须在类的内部进行初始化。示例如下:
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
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
- 第 3~11 行代码定义了学生类Student,其中,第 8 行代码定义了静态成员变量 _sum;
- 第 13~17 行代码在类外部实现有参构造函数,每当创建对象时,_sum 的值自动加 1,用于统计建立 Student 类对象的数目;
- 第 19 行代码在类外部初始化 _sum 的值为 0;
- 第 22~23 行代码创建了两个对象 stu1 和 stu2;
- 第 24~25 行代码通过对象 stu1 和 stu2 访问静态成员变量_sum,由运行结果可知,对象 stu1 和对象 stu2 访问到的静态成员变量 _sum 值均为 2;
- 第 26 行代码通过类的作用域访问静态成员变量_sum,由运行结果可知,通过类的作用域访问到的静态成员变量 _sum 值也为 2;
- 第 27 行代码计算对象 stu1 的大小,由运行结果可知,对象 stu1 的大小为 28,静态成员变量并不包含在对象中。
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
- 第 4~14 行代码定义了类 Point,其中,第 9 行代码定义了静态成员函数 getLen(),用于获取两个坐标点之间的距离;
- 第10行代码定义了静态成员变量 _len,用于存储两个坐标点之间的距离;
- 第 16~19 行代码在类外实现有参构造函数,初始化坐标点的值,默认值为 0;
- 第 21~27 行代码,在类外实现 getLen() 函数,计算传入的两个坐标 p1 和 p2 之间的距离,并将结果保存到变量 _len 中;
- 第 30~31 行代码初始化坐标点 p1 和 p2;
- 第 32 行代码调用 getLen() 函数计算两个坐标点之间的距离。
多学一招:static conts 修饰符组合修饰类成员
使用 static const 修饰符组合修饰类成员,既实现了数据共享又达到了数据不被改变的目的。此时,修饰成员函数与修饰普通函数格式一样,修饰成员变量必须在类的内部进行初始化。示例如下:
class Point
{
public:
const static float getLen();
private:
const static float area;
};
const float area=3600;
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。