c++中的static关键字-----静态成员函数和静态成员变量
什么是静态成员函数和静态成员变量??(有些地方也叫作静态函数成员和静态数据成员)
当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。
静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。
静态成员变量的用途:
静态成员变量的用途之一是统计有多少个对象实际存在。
静态成员变量的初始化:
- 静态成员变量不能在类中初始化。因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。
- 静态成员变量的值对所有的对象是一样的。静态成员变量可以被初始化,只能在类体外进行初始化。
初始化的一般形式:
数据类型类名::静态数据成员名=初值
静态成员函数没有this指针!!!
静态成员函数没有this指针,是类的所有对象共有一份而已;
非静态成员函数有this指针,每个对象都有自己的独立的this指针。
静态成员函数的使用
student.h
#pragma once #include "iostream" using namespace std; class Student { public: Student(); ~Student(); static int num; static int GetNum() { num += 15;; return num; } static int GetAge() { //age++;//error C2597: 对非静态成员“Student::age”的非法引用 //cout << age << endl;//error C2597: 对非静态成员“Student::age”的非法引用 //return age;//error C2597: 对非静态成员“Student::age”的非法引用 return 0; } static int GetAge(const Student& stu)//静态函数成员必须通过对象名来访问非静态数据成员 { //cout << age << endl;//error C2597: 对非静态成员“Student::age”的非法引用 cout << stu.age << endl; return stu.age; } private: int age; };
mainwin.cpp
#include "iostream" using namespace std; #include"student.h" int Student::num = 10; void main() { Student stu; stu.age = 19; stu.GetAge(stu);//输出19 cout << Student::num << endl;//10 Student::num = 20; cout << Student::num << endl;//20 cout << Student::GetNum() << endl;//35 cout << stu.GetNum() << endl;//50 system("pause"); }
通过上例可知:
- 静态函数成员必须通过对象名来访问非静态数据成员
另外,静态成员函数在类外实现时候无须加static关键字,否则是错误的。
若在类的体外来实现上述的那个静态成员函数,不能加static关键字,这样写就可以了:
int test::Getnum()
{
.........
}
注意事项:
- 不能用参数初始化表对静态成员初始化。一般系统缺省初始为0。static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
- 静态成员函数在类外实现时候无须加static关键字,否则是错误的。
- 静态函数成员必须通过对象名来访问非静态数据成员。(因为静态函数没有this指针)
- 静态成员不能在类定义里边初始化,只能在class body外初始化。
- 静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。
- 非静态成员函数可以任意地访问静态成员函数和静态数据成员。
拓展:
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数
由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长
调用静态成员函数:
方法一:可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数。
方法二:类名::静态成员函数

浙公网安备 33010602011771号