C++类静态成员与类静态成员函数详解

C++类静态成员与类静态成员函数详解

1. 什么是C++类的静态成员和静态成员函数?

1.1 静态成员

顾名思义,静态成员属于类而不是某个对象,与类的实例化无关。也就是说,无论有多少个类的对象被创建,静态成员的内存只分配一次,所有的类对象都共享这一内存空间。因此,静态成员也称为"类成员"。

C++类的静态成员可以是静态变量或静态函数。其中静态变量也称为类变量,是所有类对象的公共变量,同时静态变量可以被类的所有方法所访问,而不必通过对象来访问。

实例化后的普通成员变量是属于对象的,每个对象都有自己的一份。而静态成员变量不属于任何对象,所有的对象共享同一份静态成员变量的内存空间。

1.2 静态成员函数

类静态成员函数是不与任何类对象相关联的成员函数,其特点如下:

  • 它们没有this指针,也就是说,静态成员函数中不能访问非静态成员变量或成员函数,只能访问静态成员变量和成员函数。
  • 静态成员函数只能调用静态成员函数或访问静态成员变量,不能调用非静态成员函数或访问非静态成员变量。

静态成员函数主要用于实现与类本身相关的功能,比如类的初始化或清理等。

2. C++类静态成员的定义和访问

2.1 静态成员变量的定义和访问

C++类的静态成员变量定义时需要加上static关键字,并且必须在类中声明,但是在类外面定义,也就是在类定义之外的文件中定义。

class Person{
public:
    static int num; // 声明为静态变量
    static void setNum(int n);
};
int Person::num = 0; // 静态成员变量定义

上述代码定义了一个名为"num"的静态成员变量,初始值为0。在类的外部,需要通过类名加作用域限定符来访问静态成员变量。

#include <iostream>
#include "Person.h"
using namespace std;

int main()
{
    Person p1, p2;
    p1.setNum(1);
    cout << "p1.num = " << p1.num << endl; // 输出: p1.num = 1
    cout << "p2.num = " << p2.num << endl; // 输出: p2.num = 1
    p2.setNum(2);
    cout << "p1.num = " << p1.num << endl; // 输出: p1.num = 2
    cout << "p2.num = " << p2.num << endl; // 输出: p2.num = 2
    return 0;
}

上述代码中,我们创建了两个Person对象p1和p2,在p1中将num的值设置为1,然后通过类名访问p2的num时,发现其值也为1。这是因为静态成员变量是属于类的,所以p1和p2共享同一份num的内存空间。

2.2 静态成员函数的定义和访问

C++类中的静态成员函数定义时也需要加上static关键字。

class Person{
public:
    static void setNum(int n); // 声明为静态函数
};
void Person::setNum(int n) // 静态成员函数定义
{
    num = n; // 静态成员函数中可以直接访问静态成员变量
}

静态成员函数的访问同样需要通过类名加作用域限定符来实现。

#include <iostream>
#include "Person.h"
using namespace std;

int main()
{
    Person::setNum(10);
    cout << "num = " << Person::num << endl; // 输出: num = 10
    return 0;
}

3. 示例

以下是一个示例,演示了如何使用静态成员变量和静态成员函数实现"水果类":

#include <iostream>
using namespace std;

class Fruit{
public:
    static int count; // 静态成员变量
    Fruit(const char* name){ // 构造函数
        this->name = name;
        count++; // 每创建一个Fruit对象,count自增1
    }
    const char* getName(){ // 普通成员函数
        return name;
    }
    static void displayCount(){ // 静态成员函数
        cout << "Total " << count << " fruits." <<endl; // 访问静态成员变量
    }
private:
    const char* name;
};
int Fruit::count = 0; // 静态成员变量的定义与初始化

int main()
{
    Fruit apple("apple");
    Fruit banana("banana");
    Fruit orange("orange");
    Fruit::displayCount(); // 静态成员函数的调用
    cout << apple.getName() << endl;
    cout << banana.getName() << endl;
    cout << orange.getName() << endl;
    return 0;
}

上述代码定义了一个名为"Fruit"的类,其中count成员变量是静态的,而displayCount函数也是静态的。在main函数中,我们创建了三个Fruit对象,每次创建一个对象,count就自增1。最后通过Fruit::displayCount()来调用静态成员函数displayCount,输出count的值为3。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类静态成员与类静态成员函数详解 - Python技术站

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

相关文章

  • C语言中如何进行位运算操作?

    位运算是C语言中重要且常用的一种运算,用于在二进制位上执行运算操作。C语言中有6种位运算操作符:”&”、”|”、”~”、”^”、”<< “和”>>”。本文将分别对这些运算符进行详细讲解,以及通过两个示例说明如何进行位运算操作。 &(按位与)操作 按位与(&)操作符将两个数的二进制位进行逐位比较,仅当两个数对应二…

    C 2023年4月27日
    00
  • Python JSON模块的使用详情

    Python JSON模块的使用详情 什么是JSON? JSON是JavaScript对象表示法(JavaScript Object Notation)的缩写,是一种轻量级的数据交换格式。它以易于阅读和编写的文本格式为基础,通常用于在网络之间传输数据。在Python中,有一个常用的模块叫做json,可以方便地对JSON数据进行编码和解码操作。 序列化与反序列…

    C 2023年5月23日
    00
  • C语言中回调函数的含义与使用场景详解

    C语言中回调函数的含义与使用场景详解 什么是回调函数? C语言中,回调函数是指一个传入另一个函数作为参数的函数。这个传入的函数在另一个函数内部被调用。换句话说,回调函数是一种通过函数指针的技术来实现的函数间的回调。 具体来说,当一个函数调用另一个函数并向其中传递一个函数指针作为参数时,被传递的函数就被称为回调函数。 回调函数的使用场景 1. 事件回调 事件回…

    C 2023年5月24日
    00
  • 详解如何使用openssl创建自签名证书

    下面我将详细讲解如何使用openssl创建自签名证书。 1. 安装openssl 首先需要确保本地已经安装并配置了openssl,可以使用以下命令检查是否已经安装: openssl version 如果已经安装,则会返回openssl版本的信息。 如果没有安装,则需要先安装openssl,具体方法可以根据不同操作系统进行安装。 2. 生成自签名私钥 使用以下…

    C 2023年5月23日
    00
  • C语言实现扫雷小游戏详解

    C语言实现扫雷小游戏详解 简介 扫雷游戏是一款激动人心的游戏,它的目的是在不踩到地雷的情况下清除地图上的所有方块。C语言实现扫雷小游戏可以通过练习和编程技能的提高,学习C语言编程方法和数据结构。 游戏说明 游戏开始,出现一个n*n的方块图案,里面随机布置了一些“地雷”。然后,玩家需要依靠自己的智慧,打开不知道有没有地雷的方块,同时用数字来描述周围方块中地雷的…

    C 2023年5月24日
    00
  • C++中构造函数与析构函数的调用顺序详解

    当我们使用C++来编写程序时,构造函数和析构函数是非常重要的。了解它们的调用顺序是编写高质量代码的关键之一。本攻略将针对C++中构造函数和析构函数的调用顺序进行详细讲解。 构造函数和析构函数 在了解构造函数和析构函数的调用顺序之前,我们需要先了解它们的作用和定义。在C++中,构造函数用于在创建对象时初始化对象的成员变量,而析构函数则在对象生命周期结束时释放资…

    C 2023年5月22日
    00
  • C语言超详细讲解猜数字游戏的实现

    C语言超详细讲解猜数字游戏的实现 简介 本攻略将会详细讲解如何使用C语言实现猜数字游戏。猜数字游戏是非常基础的小游戏,可以用来帮助初学者掌握一些基本的编程概念和语法。 猜数字游戏的规则 在该游戏中,程序会随机生成一个1-100之间的整数,玩家需要在有限次数内猜中这个数字。每次猜测后,程序会提示玩家输入的数字与随机数字之间的大小关系,直到玩家猜中或猜测的次数用…

    C 2023年5月22日
    00
  • VBScript把json字符串解析成json对象的2个方法

    当我们在前端开发中需要使用到json数据时,可以将json对象序列化成json字符串进行传输或者存储,在需要使用时再将json字符串解析成json对象。VBScript是一种Microsoft Visual Basic语言的脚本语言,它可以通过以下两种方法将json字符串解析成json对象。 方法一:使用Microsoft Script Control解析j…

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