通过添加static关键字将成员与类结合在一起而不是与特定的对象绑定在一起,这一点和java中static关键字是一样的,而且也可以使用访问修饰符修饰
静态成员函数不和任何对象绑定在一起,他们不包含任何this 指针,作为结果,静态成员函数不能成名成const的,而且不能再静态函数的内部使用this指针。
可以使用作用域运算法直接访问静态成员。例如在Account中定义了静态的rate()函数,可以使用Accout::rate()调用。
和其他的成员函数一样,我们既可以在类的内部也可以在类的外部定义静态成员函数,当在类的外部定义静态成员函数的时候不能重复static关键字。
因为静态数据库成员不属于类的任何一个对象,所以他们不是在创建类的对象的时候被定义的,这意味着他们不是由类的构造函数初始化的,而且一般来说我们不能在类的内部初始化静态成员,相反的,必须在类的外部定义和初始化静态成员,类似于全局变量,静态成员定义于任何函数之外,一旦定义就存于程序的整个生命周期。
下面是一个使用static的例子
#include <iostream>
#include <string>
using namespace std;
class MyStatic{
public:
static void test();
static string name;
};
void MyStatic::test() {
cout<<"this is static test method"<<endl;
}
string MyStatic::name = "ssssss";
int main(void) {
MyStatic::test();
cout<<MyStatic::name<<endl;
return 0;
}
静态成员可以用于某些场景而普通成员不能
静态成员不收不完全类型的限制
class MyStatic{ private: MyStatic *my; static MyStatic instance; public: static void test(); static string name; };
在上面的例子中,如果去掉 instance 变量前的是static,那么将会编译失败
2.静态成员可以作为默认的实参,而普通成员则不行
class MyStatic{
private:
static const int a = 0;
int b;
public:
MyStatic(int c = a):b(a){
}
};
如果把常量a 的 static关键字拿到,那么编译将报错。