C++面试基础之static关键字详解

C++面试基础之static关键字详解

什么是static关键字

在C++中,static是一个关键字,用于表示类成员或者函数是静态的。静态成员是指属于类的成员,在类被加载时已经分配了内存,并不依赖于实例,而是共享内存的。静态成员被所有类的对象所共享,也可以通过类名直接访问。

static关键字的用法和作用

静态成员变量

声明静态成员变量时需要在前面加上static关键字。静态成员变量存在于类的作用域中,但是它在所有的类对象实例化中只存在一份内存。通过类名直接访问该变量,可以不用实例化对象。

class MyClass {
public:
    static int staticMember;
};

int MyClass::staticMember = 0;

int main(){
    MyClass obj1;
    MyClass obj2;
    obj1.staticMember = 10;
    cout << obj2.staticMember << endl; //输出为10
}

在该示例中,staticMemberMyClass的静态成员变量,被所有实例所共享。每个变量都可以通过类名或者对象来访问这个变量。由于是静态变量,当我们通过obj1实例改变了变量的值后,在无需创建任何新的实例对象的情况下,我们可以看到对象obj2也能访问到新的值。

静态成员函数

类中的成员函数也可以被定义为静态函数。声明静态成员函数时也需要在前面加上static关键字。静态函数不依赖于对象,可以通过类名或对象直接访问该函数,不会包含this指针。静态函数被所有的实例所共享。

class MyClass {
public:
    static void staticMemberFunction(){
        cout << "This is a static member function." << endl;
    }
};

int main() {
    MyClass::staticMemberFunction(); //通过类名直接访问静态函数
    MyClass obj;
    obj.staticMemberFunction(); //通过实例对象访问静态函数
}

static关键字的使用场景

统计对象的数量

在使用类时,有时候需要知道创建了多少个对象。我们可以使用静态成员变量来记录创建的对象的数量。

class MyClass {
private:
    static int count;
public:
    MyClass() {
        count++;
    }
    static int getCount() {
        return count;
    }
};

int MyClass::count = 0;

int main() {
    MyClass obj1;
    cout << MyClass::getCount() << endl; //输出为1
    MyClass obj2;
    cout << MyClass::getCount() << endl; //输出为2
}

缓存中的数据

在使用一些数据时,我们希望它们只被读取一次并缓存起来,这时可以使用静态成员变量来实现。

class Cache {
private:
    static int data;
    static bool isDataLoaded;
public:
    static int getData() {
        if (!isDataLoaded) {
            loadData();
            isDataLoaded = true;
        }
        return data;
    }
private:
    static void loadData() {
        data = 12345678;
    }
};

int Cache::data = 0;
bool Cache::isDataLoaded = false;

int main() {
    cout << Cache::getData() << endl; //输出为12345678
    cout << Cache::getData() << endl; //输出为12345678
}

在该示例中,dataisDataLoaded都是静态成员变量。当第一次调用getData()函数时,如果数据没有被加载,静态成员变量isDataLoaded还是false,这时会调用loadData()函数来加载数据。加载完成数据后,我们将isDataLoaded设置成true,以后每次调用getData()函数时会直接返回缓存中的数据。这种方式可以提高程序的效率和响应速度。

总结

static关键字可以用于类的静态成员变量和静态成员函数。静态成员在类被定义时就已经分配了内存,并且被所有实例共享。静态成员变量可以用于统计类的实例数量或者用于对一些数据进行缓存,提高程序响应速度。静态成员函数一般用于不依赖于对象,不需要通过实例来调用的函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++面试基础之static关键字详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 详解Linux中的awk命令

    详解Linux中的awk命令攻略 简介 awk是一种强大的文本处理工具,广泛用于Linux系统中。它可以根据指定的规则对文本进行分析、处理和转换。本攻略将详细介绍awk命令的使用方法和示例。 基本语法 awk命令的基本语法如下: awk ‘pattern { action }’ file 其中,pattern是用于匹配文本的模式,action是在匹配成功时执…

    other 2023年8月18日
    00
  • Android自定义UI手势密码简单版

    下面我来详细讲解 “Android自定义UI手势密码简单版” 的完整攻略。 一、背景知识 在开始讲解制作手势密码的过程之前,需要先了解一下Android中常用的一些UI控件,例如:View、Canvas、Path、Paint等。其中,View是Android中最基础的UI控件,Canvas是用于绘制的基础容器,Path用于描述绘制图形的路径,Paint用于设…

    other 2023年6月25日
    00
  • 魔兽世界9.0法夜圣所指挥台在哪 法夜圣所指挥台位置坐标

    魔兽世界9.0法夜圣所是新资料片“影之哀伤”中新增的副本,该副本中有一处重要的位置——指挥台。以下是“魔兽世界9.0法夜圣所指挥台在哪 法夜圣所指挥台位置坐标”的完整攻略。 1. 到达法夜圣所 首先,我们需要前往法夜圣所。法夜圣所位于达纳苏斯的右下方海域,可以通过传送门和飞行点到达。进入法夜圣所后,我们需要找到指挥台所在的位置。 2. 寻找指挥台 指挥台位于…

    other 2023年6月27日
    00
  • 详解Python开发语言中的基本数据类型

    详解Python开发语言中的基本数据类型 Python是一种动态类型语言,具有自动类型检测的能力,但是仍然会区分不同类型的数据。在Python中,我们可以直接使用多种基本数据类型来存储不同的数据。下面就让我们来详细讲解一下Python中的基本数据类型。 数值类型 Python中的数值类型包括整数(int)、浮点数(float)、复数(complex)。其中,…

    other 2023年6月27日
    00
  • FeatureCAM2018怎么安装?FeatureCAM安装详细图解(附下载地址)

    FeatureCAM 2018安装攻略 FeatureCAM是一款功能强大的计算机辅助制造(CAM)软件,用于自动化生成机械零件的加工程序。下面是FeatureCAM 2018的安装攻略,包括详细的步骤和示例说明。 步骤一:下载FeatureCAM 2018 首先,你需要下载FeatureCAM 2018的安装文件。你可以在官方网站或其他可信的软件下载网站上…

    other 2023年8月4日
    00
  • 使用jmeter查看聚合报告

    以下是关于使用JMeter查看聚合报告的完整攻略,包括基本知识和两个示例。 基本知识 JMeter是一款开源的压力测试工具,可以模拟多种协议的负载测试。在JMeter进行压力测试时,可以通过聚合报告来查看测试结果。聚合报告是一种表形式的报告,可以直观地展示测试结果,包括响应时间、吞吐量、错误率等指标。在JMeter中查看聚合报告需要以下步骤: 运行测试计划 …

    other 2023年5月7日
    00
  • Windows 2003 工作手册(1)

    Windows 2003 工作手册(1) 完整攻略 什么是 Windows 2003 工作手册? Windows 2003 工作手册是一本介绍 Windows Server 2003 操作系统的书籍,旨在为管理员提供全面的指导和帮助。 如何使用 Windows 2003 工作手册? Windows 2003 工作手册提供了丰富的知识和实用的技巧,可以帮助管理…

    other 2023年6月27日
    00
  • java 反射: 当Timestamp类型的属性值为null时,设置默认值

    Java反射:当Timestamp类型的属性值为null时,设置默认值的完整攻略 在Java中,反射是一种强大的机制,可以在运行时动态地获取类的信息并操作类的属性和方法。在使用反射时,有时需要对属性进行特殊处理,例如当Timestamp类型的属性值为null时,需要设置默认值。本文将为您提供一份完整攻略,介绍如何使用Java反射设置Timestamp类型属性…

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部