Skip to content

static

变量和函数 确保当前变量只在当前文件中生效,链接器在工作工程中不会去其他文件(全局作用域)搜寻这个变量,函数修饰同理。 类和结构体【22】C++类和结构体中的静态(static)_哔哩哔哩_bilibili

cpp
struct entity{
    static int x,y;//在类中声明该类具有一个成员变量,但是不会为其分配空间
	//静态方法、变量属于类本身而非类的任何实例,因此下面的定义也是定义在类的命名空间下的,没有this指针
    void print(){
        cout << x << " " << y;
    }
};
//int entity::x, entity::y; //需要在类外定义
int main(int argc, char const *argv[])
{
    entity a,b;
    a.x = 10, a.y = 20;
    b.x = 30, b.y = 40;
    a.print();
    cout << endl;
    b.print();
    return 0;
}

不能通过类的实例化对象去直接操作一个 static 变量,因为这块内存空间不属于任何的对象。 这么写的原因是为了跨类共享变量。 静态方法不能访问非静态内容,因为他们没有实例。 通过 static 避免意外访问

cpp
void f(){
    static int i = 0;//确保只有f能够操作i
    i++;
    cout << i << endl;
}

单例设计模式(局部静态)

暴力的使用全局变量声明对象会导致命名冲突、高耦合性。 在应用这个模式时,单例对象的类必须保证只有一个实例存在。 饿汉式 饿汉式可以保证

cpp
class singleton{
    private:
    static singleton *instance;
    public:
    static singleton& getInstance(){
        if(instance == nullptr){
            instance = new singleton();
        }
        return *instance;//解引用得到对象本身,返回其引用
    }
    void hello(){
        cout<<"hello"<<endl;
    }
};
singleton *singleton::instance = nullptr;//声明

int main(int argc, char const *argv[])
{
    singleton::getInstance().hello();//唯一实例访问点singleton::getInstance()
    //第一次get会给instance赋值为唯一的实例化对象
    return 0;
}

饿汉式的对象构造时机在静态指针 instance 初始化的时候(类加载完成后)。 懒汉式

cpp
class singleton_lazy{
    private:
        singleton_lazy(){}
        singleton_lazy(const singleton_lazy&) = delete;//禁止拷贝
        singleton_lazy& operator=(const singleton_lazy&) = delete;//禁止赋值
    public:
        ~singleton_lazy(){}
        static singleton_lazy& getInstance(){
            static singleton_lazy instance;
            return instance;
        }
        //返回的必须是一个静态对象的引用,否则会触发对象拷贝,造成资源浪费,且不满足单例对象
        void hello(){
            cout<<"hello"<<endl;
        }
};

int main(int argc, char const *argv[])
{
    singleton_lazy& sl = singleton_lazy::getInstance();
    sl.hello();
}

懒汉式的构造时机完全由调用 getInstance 的时机决定。 线程安全的懒汉式C++单例模式 (qq.com)