C++ static详解,类中的static用法说明

C++ static详解

一、static

static 是 C++ 中的关键字,用于表示静态的意思。它可以修饰类的成员变量和成员函数,以及全局变量和函数,具体用法如下:

1.1 类的静态成员变量

类的静态成员变量是指在类中声明的以 static 关键字开头的成员变量。它是归属于类的,而不是归属于类的对象。因此,在创建类的对象时,并没有为静态成员变量分配存储空间,而是在程序编译时就已经把它的空间分配好了,所有的对象共享同一块空间。静态成员变量可以通过类名直接访问。

#include <iostream>

using namespace std;

class Box {
public:
    static int count; // 静态成员变量
    Box(double l = 2.0, double b = 2.0, double h = 2.0) {
        cout << "Constructor called." << endl;
        length = l;
        breadth = b;
        height = h;
        count++; // 静态成员变量自增
    }
    double Volume() {
        return length * breadth * height;
    }
private:
    double length;
    double breadth;
    double height;
};

int Box::count = 0; // 静态成员变量初始化

int main() {
    Box box1(3.3, 1.2, 1.5);
    Box box2(8.5, 6.0, 2.0);
    cout << "Total objects: " << Box::count << endl; // 直接访问静态成员变量
    return 0;
}

输出:

Constructor called.
Constructor called.
Total objects: 2

1.2 类的静态成员函数

类的静态成员函数是指在类中声明的以 static 关键字开头的成员函数。它同样是归属于类的,而不是归属于类的对象。因此,它没有 this 指针,这意味着它无法访问非静态成员变量和非静态成员函数。可以通过类名直接调用静态成员函数。

#include <iostream>

using namespace std;

class Box {
public:
    static int count; // 静态成员变量
    Box(double l = 2.0, double b = 2.0, double h = 2.0) {
        cout << "Constructor called." << endl;
        length = l;
        breadth = b;
        height = h;
        count++; // 静态成员变量自增
    }
    double Volume() {
        return length * breadth * height;
    }
    static int getCount() {
        return count;
    }
private:
    double length;
    double breadth;
    double height;
};

int Box::count = 0; // 静态成员变量初始化

int main() {
    Box box1(3.3, 1.2, 1.5);
    Box box2(8.5, 6.0, 2.0);
    cout << "Total objects: " << Box::getCount() << endl; // 直接调用静态成员函数
    return 0;
}

输出:

Constructor called.
Constructor called.
Total objects: 2

1.3 全局变量和函数的静态

在全局变量和函数中使用 static 关键字,则它们的作用域被限制在声明所在的文件中,不能被其他文件所访问。

// file1.cpp
#include <iostream>

using namespace std;

static int count; // 静态全局变量

static void printCount() { // 静态全局函数
    cout << "Count: " << count << endl;
}

int main() {
    count = 5; // 静态全局变量赋值
    printCount(); // 直接调用静态全局函数
    return 0;
}

输出:

Count: 5

二、static与const

在 C++ 中,static 也可以用于修饰 const 类型的变量。这种修饰主要用于在头文件中定义常量,防止在多个文件中重复定义。

// constants.h
static const int MAX = 100; // 常量定义

// file1.cpp
#include "constants.h"
#include <iostream>

using namespace std;

int main() {
    cout << MAX << endl; // 直接访问常量
    return 0;
}

// file2.cpp
#include "constants.h"
#include <iostream>

using namespace std;

int main() {
    cout << MAX << endl; // 直接访问常量
    return 0;
}

输出:

100
100

三、总结

本文介绍了 C++ 中 static 关键字的用法。它可以用于修饰类的成员变量和成员函数、全局变量和函数,以及 const 类型的常量。要注意的是,静态成员变量和静态成员函数归属于类,而不是对象,因此可以通过类名直接访问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ static详解,类中的static用法说明 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++模拟实现vector示例代码图文讲解

    下面我将给您详细讲解“C++模拟实现vector示例代码”的完整攻略。 1. 什么是Vector Vector(又称为动态数组)是C++ STL中的一种容器,它可以在运行的过程中自动调整自己的大小,且支持随机访问,其底层是基于数组实现的。 2. 实现Vector的需求 C++中的vector容器具有以下功能: 动态扩容/缩容 随机访问 插入/删除指定位置元素…

    C 2023年5月30日
    00
  • JavaScript数据结构中栈的应用之表达式求值问题详解

    JavaScript数据结构中栈的应用之表达式求值问题详解 背景 在JavaScript中,算术表达式很常见,例如 (2 + 3) * 4 – 8 / 2。对于一个算术表达式,我们需要将它转化为一个数值。要对表达式求值,我们需要确定运算符优先级和结合性。其中,左结合表示从左到右计算,右结合表示从右到左计算。 步骤 我们可以用栈来求一个表达式的值。具体的求值过…

    C 2023年5月22日
    00
  • ProE怎么设计立体的C型轮廓?

    要设计立体的C型轮廓,可以遵循以下步骤: 步骤一:绘制基本轮廓线 首先,打开ProE软件并创建一个新的零件。然后选择绘图工具中的“草图”工具,开始绘制轮廓线的基本形状。 例如,可以先绘制上部和底部线条,然后在中间画上一条垂直线条将两条线连接起来。在绘图时,需要注意轮廓曲线应该是封闭的,因为这是一个立体的轮廓线。在草图中可以加入尺寸,以确保轮廓大小和位置的准确…

    C 2023年5月23日
    00
  • C语言实现学生成绩管理系统实战教学

    C语言实现学生成绩管理系统实战教学 系统功能介绍 本系统基于 C 语言开发,主要功能包括: 学生信息管理 课程信息管理 学生成绩管理 成绩查询 成绩统计与分析 需要安装的环境 开发本系统需要安装以下软件: C 语言编译器(如 GCC) 编辑器(如 Visual Studio Code) Windows/Linux/Mac 等操作系统 程序设计思路 本系统采用…

    C 2023年5月23日
    00
  • Hibernate缓存详解

    Hibernate缓存详解 Hibernate缓存是指将常用的数据缓存在内存中,以便于快速读取和更新。Hibernate缓存可以分为一级缓存和二级缓存两种。一级缓存是指SessionFactory级别的缓存,二级缓存是指应用程序级别的缓存。下面分别介绍一级缓存和二级缓存的细节。 一级缓存 Hibernate的一级缓存默认是开启的,每个Session都有自己的…

    C 2023年5月22日
    00
  • swift4更新中所遇到的一些问题总结

    Swift4更新中所遇到的一些问题总结 在使用Swift进行开发过程中,我们经常会遇到各种问题。随着Swift4的推出,其中也包含了许多新的变化,这篇文章将会总结一些在Swift4更新中所遇到的问题,并提供一些解决的方法。下面将笔者所遇到的问题以及解决方法列举出来,供大家参考。 Xcode9.3升级后无法使用Alamofire 在Xcode9.3升级后,许多…

    C 2023年5月23日
    00
  • JSONP基础知识详解

    当在跨域请求数据时,由于浏览器的同源策略限制,一般会遇到跨域的问题。而JSONP作为一种解决跨域问题的方式,也被广泛应用在前端开发中。本文将详细讲解JSONP的相关知识和使用方法。 什么是JSONP? JSONP是JSON with Padding的缩写,即使用json数据,并使用JavaScript函数来执行该数据的回调的一种技术。JSONP不是官方的规范…

    C 2023年5月23日
    00
  • C++头文件和cpp文件的原理分析

    下面我会为你详细讲解“C++头文件和cpp文件的原理分析”的完整攻略,包含以下内容: C++头文件和cpp文件的作用: 头文件和cpp文件相当于C++中的两个重要的分离式编译的机制。「头文件」通常包含程序所用到的函数的声明和类的定义,而「cpp文件」则包含函数的实现和类的方法定义。C++通过将程序分割为不同的文件来提高软件的可维护性和可扩展性,使得每个文件包…

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