详解C++编程中的静态成员与可变数据成员

 更新时间:2016年01月22日 15:51:59   投稿:goldensun  
这篇文章主要介绍了详解C++编程中的静态成员与可变数据成员,是C++入门学习中的基础知识,需要的朋友可以参考下

静态成员
类可以包含静态成员数据和成员函数。当数据成员被声明为“静态”时,只会为类的所有对象保留一个数据副本。
静态数据成员不是给定的类类型的对象的一部分。因此,静态数据成员的声明不被视为一个定义。在类范围中声明数据成员,但在文件范围内执行定义。这些静态类成员具有外部链接。下面的示例阐释了这一点:

// static_data_members.cpp
class BufferedOutput
{
public:
  // Return number of bytes written by any object of this class.
  short BytesWritten()
  {
   return bytecount;
  }

  // Reset the counter.
  static void ResetCount()
  {
   bytecount = 0;
  }

  // Static member declaration.
  static long bytecount;
};

// Define bytecount in file scope.
long BufferedOutput::bytecount;

int main()
{
}

在前面的代码中,该成员 bytecount 在类 BufferedOutput 中声明,但它必须在类声明的外部定义。
在不引用类类型的对象的情况下,可以引用静态数据成员。可以获取使用 BufferedOutput 对象编写的字节数,如下所示:

long nBytes = BufferedOutput::bytecount;

对于存在的静态成员,类类型的所有对象的存在则没有必要。还可以使用成员选择(. 和 –>)运算符访问静态成员。例如:

BufferedOutput Console;

long nBytes = Console.bytecount;

在前面的示例中,不会评估对对象(Console) 的引用;返回的值是静态对象 bytecount 的值。
静态数据成员遵循类成员访问规则,因此只允许类成员函数和友元拥有对静态数据成员的私有访问权限。


可变数据成员
此关键字只能应用于类的非静态和非常量数据成员。如果某个数据成员被声明为 mutable,则从 const 成员函数为此数据成员赋值是合法的。
语法

mutable member-variable-declaration;

备注
例如,以下代码在编译时不会出错,因为 m_accessCount 已声明为 mutable,因此可以由 GetFlag 修改,即使 GetFlag 是常量成员函数。

// mutable.cpp
class X
{
public:
  bool GetFlag() const
  {
   m_accessCount++;
   return m_flag;
  }
private:
  bool m_flag;
  mutable int m_accessCount;
};

int main()
{
}

相关文章

  • C语言 function recursion函数递归详解

    C语言 function recursion函数递归详解

    递归指的是在函数的定义中使用函数自身的方法,举个例子: 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,循环下去
    2021-10-10
  • VScode+ESP32简单环境搭建

    VScode+ESP32简单环境搭建

    本文章向大家介绍ESP32-C3搭建环境教程,主要包括ESP32-C3搭建环境教程使用实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 浅析c#中WebBrowser控件的使用方法

    浅析c#中WebBrowser控件的使用方法

    以下是对c#中WebBrowser控件的使用方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • C语言实现扫雷游戏及其优化

    C语言实现扫雷游戏及其优化

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏及其优化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Win10中VC2013安装Unit test组件出现问题解决方案

    Win10中VC2013安装Unit test组件出现问题解决方案

    本文给大家分享的是个人在Win10中VC2013安装Unit test组件出现问题并最终找到解决办法的过程,有需要的小伙伴可以参考下
    2016-03-03
  • 详解C++中的左值,纯右值和将亡值

    详解C++中的左值,纯右值和将亡值

    C++中本身是存在左值,右值的概念,但是在C11中又出现了左值,纯右值,将亡值得概念;这里我们主要介绍这些值的概念,感兴趣的可以了解一下
    2022-09-09
  • C语言实现小型电子词典

    C语言实现小型电子词典

    这篇文章主要为大家详细介绍了C语言实现小型电子词典,用户可以进行英译汉、汉译英等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C++栈的数组实现代码

    C++栈的数组实现代码

    这篇文章主要介绍了C++栈的数组实现方式,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C++ 设置控制台(命令行)窗口 光标位置,及前背景颜色

    C++ 设置控制台(命令行)窗口 光标位置,及前背景颜色

    这篇文章主要介绍了C++ 设置控制台(命令行)窗口 光标位置,及前背景颜色,需要的朋友可以参考下
    2019-04-04
  • Opencv实现用于图像分割分水岭算法

    Opencv实现用于图像分割分水岭算法

    这篇文章主要为大家详细介绍了Opencv实现用于图像分割分水岭算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论