此网站为连连棋牌演示网站
当前位置:首页 > C++ > 正文

C++ 存储类

01-03 C++

  存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:

  自 C++ 11 以来,auto关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。

  C++98标准中auto关键字用于自动变量的声明,但由于使用极少且多余,在C++11中已删除这一用法。

  register存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 & 运算符(因为它没有内存位置)。

  寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 register 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。

  static存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

  static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

  在 C++ 中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。

  extern存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。

  当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用extern来得到已定义的变量或函数的引用。可以这么理解,extern是用来在另一个文件中声明一个全局变量或函数。

  extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:

  在这里,第二个文件中的extern关键字用于声明已经在第一个文件 main.cpp 中定义的 count。现在 ,编译这两个文件,如下所示:

  mutable说明符仅适用于类的对象,这将在本教程的最后进行讲解。它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。

  使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。

  using namespace std,它声明了命名空间std,后续如果有未指定命名空间的符号,那么默认使用std,这样就可以使用cin、cout、vector等。

  cin是输入流对象,cout是输出流对象,它们分别可以用和,是因为分别在其类中对相应运算符进行了重载。

  在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。 我们先举一个静态局部变量的例子,如下:

  通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。

  通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

  静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

  静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;

  静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;

  它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

  const 修饰的成员函数中不能修改成员变量,不能调用非 const 修饰的函数

  std代表标准命名空间,::则是作用域运算符,在这里用于定位到std命名空间。

  using namespace std;的作用是曝光整个std名称空间,使其中的所有成员皆可直接使用。

  2.有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

  eg:A 线程是用来拉取数据的,B 线程是用来更新 UI 的,那么 A在拉去数据后应该通知B线程去更新 UI,因为 A 线程不能更新 UI,此时更新 UI 就应该由 B 线程的thread_local去进行(因为只有 B 线程能访问),这样可以防止因为跨线程更新 UI 引起的问题。

  在编写 Lambda 表达式的时候,发现 gcc 似乎不支持 auto 类型。

  经过查询,发现 gcc 是 4.8.4 版本,应该是默认不开启,但是可以通过添加编译参数-std=c++11解决问题,

  在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其 初始化为0。

  静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。

版权保护: 本文由 首页 原创,转载请保留链接: http://www.wsxzr.com/News/337.html

博客主人bfyysw
男,文化程度不高性格有点犯二,已经20来岁至今未婚,闲着没事喜欢研究各种代码,资深技术宅。
  • 文章总数
  • 43823访问次数
  • 建站天数
  • 标签