zoukankan      html  css  js  c++  java
  • 静态成员的语法总结及应用-单例模式

    1. 静态成员

      1.1:被static修饰的成员变量、函数

       1.2:可以通过对象(对象.静态成员)、对象指针(对象指针->静态成员)、类访问(类名::静态成员)

    2.静态成员变量

      2.1: 存储在数据段(全局区,类似于全局变量),整个成员运行过程中只有一份内存

      2.2: 必须初始化,必须在类外初始化,初始化时不能带staiic,如果类的声明和实现分离(在实现的cpp文件中初始化)

      2.3: 对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的

    3.静态成员函数

      3.1: 内部不能使用this指针(this指针只能在非静态成员函数内部使用)

      3.2: 不能是虚函数(虚函数只能是非静态成员函数)

      3.3: 内部不能访问非静态成员变量函数,只能访问静态成员变量函数

      3.4: 构造函数、析构函数不能是静态

      3.5: 当实现和声明分离时,实现部分不能带static

    静态成员实现案例:

    class Car {

      int m_price;

      static int ms_count;

    public:

      static int getcount() {

        return ms_count;

      }

      Car(int price = 0) :m_price(price) {

      ms_count++;

      }

      ~Car() {

      ms_count--;

      }

    };

    int Car::ms_count = 0;//静态成员类外初始化

    静态成员应用——单例模式(打印机使用)

    应用背景:假设一个办公室只有一台打印机,那么这台打印机为互斥访问资源,当有人在使用时其他人就不能使用,并且显示地说明当每使用一次打印机

          打印机的使用次数就加一。由于只有一台打印机,故该打印机类只能创建一个对象并且该对象在整个程序运行期间不能被销毁。

    1. 将构造函数私有化,即设定private权限 使得类外不能创建多个对象

    2. 将打印机指针私有化  对外提供接口

    3. 防止类外通过拷贝构造函数构建一个新对象 在参数列表中加入const关键字

    4.提供static关键字,使得成为共享数据

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    using namespace std;
    #include <string>
    class Printer
    {
    public:
    static Printer * getInstance()
    {
    return printer;
    }

    void printText(string text)
    {
    m_Count++;
    cout << text << endl;
    }

    int m_Count;

    private:

    Printer()
    {
    m_Count = 0;
    //cout << "打印机构造调用" << endl;
    };

    Printer(const Printer & p){};

    static Printer * printer;


    };

    Printer * Printer::printer = new Printer;


    void test01()
    {
    Printer * p1 = Printer::getInstance();
    p1->printText("入职证明");
    p1->printText("离职证明");
    p1->printText("加薪申请");
    p1->printText("旅游申请");

    cout << "打印机使用次数: " << p1->m_Count << endl;


    Printer * p2 = Printer::getInstance();
    p2->printText("调休申请");

    cout << "打印机使用次数: " << p1->m_Count << endl;

    }

    int main(){
    // cout << "mian函数调用" << endl;

    test01();

    system("pause");
    return EXIT_SUCCESS;
    }



  • 相关阅读:
    学习SpirngMVC之如何获取请求参数
    深入理解 CSS3 弹性盒布局模型
    JavaScript正则表达式验证大全(收集)
    我所认识的JavaScript正则表达式
    不再以讹传讹,GET和POST的真正区别
    JavaScript中的正则表达式
    Unicode 与 Unicode Transformation Format(UTF-8 / UTF-16 / UTF-32)
    PHP垃圾回收机制
    排序算法系列
    求最短路径算法系列
  • 原文地址:https://www.cnblogs.com/liyaning/p/14724242.html
Copyright © 2011-2022 走看看