概念
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;
用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化
class A { public: static int GetACount() { return _scount; } private: static int _scount; }; int A::_scount = 0; void TestA() { cout << A::GetACount() << endl; }
注:static静态成员不属于某个对象,属于整个类
特性
1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制
问题1 :静态成员函数可以调用非静态成员函数吗?
不能
静态成员函数与静态数据成员一样,都是类的内部 实现,属于类定义的一部分,它为类的全部服务而不是为某一个类的具体对象服务。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this 是缺省的。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此静态成员函数不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
问题2 :非静态成员函数可以调用类的静态成员函数吗?
非静态函数可以调用静态成员,但静态函数‘只能’直接访问静态成员,要访问非静态得传参数
因为静态函数可以直接通过 类::函数 中方式调用,不用通过对象来调用函数,而非静态函数必须通过对象来调用,这里面还涉及到实例化对象时候的内存分配。
看完之后还认识静态的“静”这个字吗?😆
出个题
面试题:实现一个类,计算程序中创建出了多少个类对象
class A { public: A() { ++_scount; } A(const A& t) { ++_scount; } ~A() { --_scount; } static int GetACount() { return _scount; } private: static int _scount; }; int A::_scount = 0; void TestA() { cout << A::GetACount() << endl; A a1, a2; A a3(a1); cout << A::GetACount() << endl; }