C++中static修饰符的详解及其作用介绍

 更新时间:2021年09月07日 11:05:30   作者:我是小白呀  
这篇文章主要介绍了C++中static修饰符的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

概述

static (静态) 修饰符是用来控制变量的存储方式和可见性的. 静态局部变量存储在静态区域:

在这里插入图片描述

static 的性质:

  • 局部特性:作用范围仅限于本函数
  • 静态特性:存储在静态区, 函数调用结束后不孝顺而保留原值. 在下一次调用时, 保留上一次调用结束时的值.

静态数据成员

在我们定义全局变量的时候, 我们会发现一个问题:
我们可以在程序各处自由的修改全局变量的值 (不安全).

静态数据成员的特点:

  1. 静态数据成员被所有对象共享, 在所有对象之外单独开辟空间存储
  2. 静态数据成员所占空间并不随某个对象的撤销而释放
  3. 静态数据成员可以在同类的多个对象之间实现数据共享

在这里插入图片描述

引用静态数据成员

Student 类:

#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H

#include <string>
using namespace std;

class Student {
private:
    static int count;  // 定义静态数据成员
    int num;
    string name;
    char gender;
public:
    Student();
    Student(int num, string name, char gender);
    ~Student();
    int getCount() {return count;}
    void display();
};

#endif //PROJECT1_STUDENT_H

Student.cpp:

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

// 类外初始化静态数据成员
int Student::count = 0;

// 无参构造
Student::Student() : num(-1), name("None"), gender('N') {}

Student::Student(int n, string p, char g) : num(n), name(p), gender(g) {
    count ++;
}

void Student::display() {
    cout << "num: " << num << endl;
    cout << "name: " << name << endl;
    cout << "gender: " << gender << endl;
    cout << "===============" << endl;
}

Student::~Student() {
    count --;
}

main:

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

int main() {

    Student student1(1, "Little white", 'f');
    cout << student1.getCount() << endl;

    Student *pt = new Student(1, "Little white", 'f');
    cout << pt -> getCount() << endl;
    cout << student1.getCount() << endl;

    // 释放
    delete pt;
    cout << student1.getCount() << endl;

    return 0;
}

输出结果:

1
2
2
1

静态数据成员是 “大家” 的:

  • 静态数据成员不属于某对象, 而是属于类的所有对象. 不过, 用类的对象可以引用它
  • 如果静态数据成员被定义为私有的, 则不能在类外直接引用, 而必须通过公用的成员函数引用
  • 静态数据成员实现了各对象之间的数据共享, 同时避免了使用全局变量破坏了封装的原则

用类名访问数据成员

Student 类:

#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H

#include <string>
using namespace std;

class Student {
private:
    int num;
    string name;
    char gender;
public:
    static int count;  // 定义静态数据成员
    Student();
    Student(int num, string name, char gender);
    ~Student();
    int getCount() {return count;}
    void display();
};

#endif //PROJECT1_STUDENT_H

Student.cpp:

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

// 类外初始化静态数据成员
int Student::count = 0;

// 无参构造
Student::Student() : num(-1), name("None"), gender('N') {}

Student::Student(int n, string p, char g) : num(n), name(p), gender(g) {
    count ++;
}

void Student::display() {
    cout << "num: " << num << endl;
    cout << "name: " << name << endl;
    cout << "gender: " << gender << endl;
    cout << "===============" << endl;
}

Student::~Student() {
    count --;
}

main:

int main() {
    
    cout << Student::count << endl;
    Student *pt = new Student(1, "Little white", 'f');
    cout << pt -> getCount() << endl;

    // 释放
    delete pt;
    cout << Student::count << endl;

    return 0;
}

输出结果:

0
1
0

静态数据成员既可以通过对象名引用, 也可以通过类名来引用. 在作用域内, 通过类名和运算符 “::” 引用静态数据成员时, 不用考虑该类知否有对象存在.

静态成员函数

成员函数也可以定义为静态的, 我们只需要在类声明函数的前面加上 static 关键字. 如:

#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H

#include <string>
using namespace std;

class Student {
private:
    int num;
    string name;
    char gender;
public:
    static int count;  // 定义静态数据成员
    Student();
    Student(int num, string name, char gender);
    ~Student();
    static int getCount() {return count;}  // 定义静态成员函数
    void display();
};

#endif //PROJECT1_STUDENT_H

静态成员函数的作用就是为了能处理静态数据成员, 即不需要 this 指针访问的成员.

重点:

  • 静态成员的本质特征是类中所有对象的 “公共元素”
  • 静态成员的语法特征是通过类名和域运算符 “::” 引用, 而不只是通过对象引用

综合案例

Student 类:

#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H

#include <string>
using namespace std;

class Student {
private:
    int num;
    string name;
    char gender;
    int score;
public:
    static int count;  // 定义静态数据成员
    static int sum;  // 定义静态数据成员
    Student();
    Student(int num, string name, char gender, int score);
    ~Student();
    static double average() {return (sum / count);}
    static int getCount() {return count;}
    void display();
};

#endif //PROJECT1_STUDENT_H

Student.cpp:

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

// 类外初始化静态数据成员
int Student::count = 0;
int Student::sum = 0;

// 无参构造
Student::Student() : num(-1), name("None"), gender('N'), score(-1) {}

Student::Student(int n, string p, char g, int s) : num(n), name(p), gender(g), score(s) {
    count ++;
    sum += s;
}

void Student::display() {
    cout << "num: " << num << endl;
    cout << "name: " << name << endl;
    cout << "gender: " << gender << endl;
    cout << "===============" << endl;
}

Student::~Student() {
    count --;
}

main:

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

int main() {

    // 创建student数组
    Student student_array[3] = {
            Student(1, "Little white", 'f', 68),
            Student(2, "Small white", 'f', 78),
            Student(3, "Big white", 'f', 88)
    };

    // 调试输出平均分
    cout << "三个学生的平均分是: " << Student::average() << endl;

    return 0;
}

输出结果:

三个学生的平均分是: 78

到此这篇关于C++中static修饰符的详解及其作用介绍的文章就介绍到这了,更多相关C++ static内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++创建二维动态数组与内存释放问题

    c++创建二维动态数组与内存释放问题

    这篇文章主要介绍了c++创建二维动态数组与内存释放问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 聊一聊C++虚函数表的问题

    聊一聊C++虚函数表的问题

    C++是面向对象的语言(与C语言主要区别),所以C++也拥有多态的特性。下面通过代码看下C++虚函数表的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • 基于OpenCV 差分法实现绿叶识别

    基于OpenCV 差分法实现绿叶识别

    物体识别是图像处理学在现实生活中较多的应用之一,本文提供了一种相对简单的思路来实现绿叶识别,适合初学图像处理的新人研究参考。感兴趣的同学可以关注一下
    2021-11-11
  • c++中string类型和int类型相互转换的几种常用方法

    c++中string类型和int类型相互转换的几种常用方法

    我们在编写程序时,经常涉及到int与string之间的类型转换,本文主要介绍了c++中string类型和int类型相互转换的几种常用方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • c++实现跳跃表(Skip List)的方法示例

    c++实现跳跃表(Skip List)的方法示例

    跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入、删除、查找的复杂度均为O(logN),下面这篇文章主要介绍了c++实现跳跃表(Skip List)的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-09-09
  • C语言实现反弹球游戏

    C语言实现反弹球游戏

    这篇文章主要为大家详细介绍了C语言实现反弹球游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言数据结构深入探索顺序表

    C语言数据结构深入探索顺序表

    顺序表,全名顺序存储结构,是线性表的一种,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外,不仅如此,顺序表对数据的物理存储结构也有要求,跟随下文来具体了解吧
    2022-03-03
  • C/C++ 实现简易HTTP服务器的示例

    C/C++ 实现简易HTTP服务器的示例

    这篇文章主要介绍了C/C++ 实现简易HTTP服务器的示例,帮助大家更好的理解和学习C/C++编程,感兴趣的朋友可以了解下
    2020-10-10
  • C语言结构及队列实现示例详解

    C语言结构及队列实现示例详解

    这篇文章主要为大家介绍了C语言实现队列示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • C++实现哈夫曼树算法

    C++实现哈夫曼树算法

    这篇文章主要为大家详细介绍了C++实现哈夫曼树的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04

最新评论