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日

相关文章

  • ElementUI 修改默认样式的几种办法(小结)

    下面我将详细讲解一下“ElementUI 修改默认样式的几种办法(小结)”的完整攻略。 样式修改方式 在使用 ElementUI 时,我们通常需要对一些默认的组件样式进行修改,以满足业务需求。下面是几种常用的样式修改方式: 1. 使用深度作用选择器 通过使用 >>> 或 /deep/,可以将样式的作用范围扩大到组件内部。例如: <st…

    other 2023年6月27日
    00
  • xcode好用的插件(随时更新)

    Xcode好用的插件(随时更新) 作为iOS或macOS开发者,Xcode是我们必备的开发工具之一。而在Xcode的开发过程中,有很多插件可以提高我们的开发效率和舒适度。在这篇文章中,我将会介绍一些我个人认为好用的插件,并且会随时更新以保证插件的实用性和最新性。 Alcatraz Alcatraz是Xcode插件管理器,它可以帮助我们安装、更新或卸载插件,使…

    其他 2023年3月29日
    00
  • Ubuntu Apache配置以及cgi配置方法

    下面我来为您讲解Ubuntu Apache配置以及CGI配置方法的完整攻略。 Ubuntu Apache配置 安装Apache 1. 更新系统 sudo apt-get update 2. 安装Apache服务器 sudo apt-get install apache2 3. 启动Apache服务器 sudo systemctl start apache2 …

    other 2023年6月27日
    00
  • ios基础-瀑布流

    iOS基础-瀑布流 什么是瀑布流? 瀑布流是一种常见的UI设计,常常用于网页和移动应用程序中的图片展示。瀑布流布局以其独特的分布方式、流体布局的特点以及其吸引人的外观而获得了很多粉丝。 这个布局的名称瀑布流,源于其布局方式,像是由多个不同大小的石块按照规定的方式堆砌而成的瀑布,每一块石头都各有不同的形状、大小和位置,整个瀑布流的视觉效果非常美观。 瀑布流设计…

    其他 2023年3月29日
    00
  • Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

    下面将详细讲解“Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解”的完整攻略。 环境准备 首先,我们需要准备好以下环境: JDK 1.8 或以上版本 Maven 3.5 或以上版本 ZooKeeper 3.6.0 或以上版本 IntelliJ IDEA 或其他Java IDE 创建Spring Boot项目 第一步,我们需要创…

    other 2023年6月20日
    00
  • 【转】winrar命令行详解

    【转】winrar命令行详解 WinRAR是一个强大的文件压缩、解压缩软件,常常被用于在Windows系统中对文件进行压缩、备份和归档。除了通过图形界面使用WinRAR,还可以通过命令行来使用它提供的功能。本文将详细解释WinRAR的命令行参数及其用法。 WinRAR命令行用法 WinRAR的命令行用法如下: WinRAR [<命令>] -[&l…

    其他 2023年3月28日
    00
  • SpringBoot 自定义starter yaml提示失效问题及解决方法

    方案概览: 在使用SpringBoot自定义starter时,我们经常需要使用application.yaml来为starter提供配置项,但是当我们在其他项目中使用自定义的starter时,IDE可能没有自动提示可用的yaml配置,这是一种很烦人的情况。这篇攻略将会解决这个问题。 解决方法: 在自定义starter的jar包中添加以下两个文件: META-…

    other 2023年6月27日
    00
  • java 方法重写与权限修饰符以及多态和抽象类详解概念和用法

    Java方法重写与权限修饰符以及多态和抽象类是面向对象编程中非常重要的概念和用法。下面将详细讲解。 Java方法重写与权限修饰符 什么是方法重写 方法重写是指在子类中重新定义继承自父类的同名方法,其方法签名(即方法的名称、参数类型和数量)必须与父类方法相同,但方法体可以不同。方法重写的目的是为了实现方法的多态性,即同一种方法,在不同的子类中所表现出的行为不同…

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