C++中的静态

通过添加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;
}

静态成员可以用于某些场景而普通成员不能

  1. 静态成员不收不完全类型的限制

    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关键字拿到,那么编译将报错。