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

 更新时间:2021年11月3日 16:00  点击:2193 作者:学渣的C/C++

1、类的静态成员变量

C++类的静态成员变量主要有以下特性:

1.静态成员变量需要类内定义,类外初始化

2.静态成员变量不依赖于类,静态成员变量属于全局区,不属于类的空间。

3.静态成员变量通过类名访问,也可以通过对象访问,同一类的不同对象,静态成员共享同一份数据

下面通过代码验证以上三种说法:

#include <iostream>
using namespace std;
class Base{
public:
    static int val1;  //类内定义,类外初始化,如果直接初始化编译器会报错
    int val2;
private:
    static int val3;
};
int Base::val1(1);  //类外初始化,通过类名访问静态成员
int Base::val3(2);  //类外初始化,即便是私有属性也可以通过类名访问静态成员

int main()
{
    Base base1;
    Base base2;
    base1.val1 = 10;
    base2.val1 = 11;
    cout << sizeof(Base) <<endl; //类的大小只有四字节,说明静态成员并不依赖类存在,有自己的独立空间 
    cout << base1.val1 << " " << base2.val1 << endl;   
    system("pause");
    return 0;
}

代码运行结果为:

通过代码运行结果我们可以确定,Base类的大小只有4字节,说明类静态成员有自己的独立空间,位于静态全局区,且所有对象共享同一份内存,代码修改了base2对象的静态变量val1,base1的val1也输出为11,说明他们共享同一份内存。

那么如果一个类继承了同名的静态变量,会不会共享内存空间呢?下面通过代码验证:

#include <iostream>
using namespace std;
class Base{
public:
    static int val1;  //类内定义,类外初始化,如果直接初始化编译器会报错
    int val2;
private:
    static int val3;
};
int Base::val1(1);  //类外初始化,通过类名访问静态成员
int Base::val3(2);  //类外初始化,即便是私有属性也可以通过类名访问静态成员
class Son : public Base {
public:
    static int val1; //类内定义,类外初始化,与父类同名的静态变量
};
int Son:: val1 = 3; //类外初始化
int main()
{
    Son son1;    
    cout << son1.val1 << " " << son1.Base::val1 << endl;  //通过对象方式访问静态成员变量
    cout << Son::val1 << " " << Base::val1 << endl; //通过类名方式访问静态成员变量
    system("pause");
    return 0;
}

代码运行结果为:

通过代码验证,当子类继承父类,且子类和父类含有同名的静态变量,他们并不会共享内存空间,与常量定义一致,而是各自开辟了空间,只不过通过对象访问父类中的静态成员要加上父类的作用域。

2、静态成员函数

类的静态成员函数应该明确以下几点:

1.函数不占用对象空间,静态成员函数也不占用对象空间

2.所有对象共享同一个函数

3.静态成员函数不能访问非静态成员变量

4.静态成员函数也可以通过类名直接访问

5.静态成员函数有访问权限

下面通过代码验证:

#include <iostream>
using namespace std;
class Base{
public:
    static int val1;
    int val2;
    static void func1(){
        //val2 = 10; //静态成员函数访问非静态成员变量,编译会报错
        val1 = 10; //只能访问静态成员
        cout << "func1()" << endl;
    }
private:
    static void func2(){
        cout << "func2()" << endl;
    }
};
int Base::val1(1);
int main()
{
    cout << "Base size = " << sizeof(Base) << endl;
    Base base1;
    Base base2;
    base1.func1(); //通过对象访问
    //base1.func2(); //类的私有权限,不能访问
    Base::func1(); //通过对象访问
   // Base::func2(); //私有权限,不能访问
    cout << base1.val1 << " " << base2.val1 << endl;
    system("pause");
    return 0;
}

代码运行结果为:

代码运行结果说明,静态成员函数也不占用对象空间,所有对象共享同一个静态成员函数,代码中,base1通过静态成员函数修改的静态成员后。base2对象的静态成员也被修改,其次,.静态成员函数可以通过类名直接访问,静态成员函数有访问权限,都已在代码中说明了。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!

原文出处:https://www.cnblogs.com/qin6666/p/15496676.html

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04