Auto
声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。
C++11已弃用。
auto f=3.14;
auto s("hello");
auto z = new auto(9);
auto x1 = 5, x2 = 5.0, x3='r';
register
定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。{ register int miles; }
static
- 局部变量
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。 - 全局变量
当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。 - 类
- 静态数据成员
在 C++ 中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。
静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符::来重新声明静态变量从而对它进行初始化,如下面的实例所示。
class Box
{
public:
static int objectCount;
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
private:
double length;
double breadth;
double height;
};
int Box::objectCount = 0;
int main(void)
{
cout << "Total objects: " << Box::objectCount << endl;
Box Box1(3.3, 1.2, 1.5);
Box Box2(8.5, 6.0, 2.0);
cout << "Total objects: " << Box::objectCount << endl;
return 0;
}
可以看出,类box在没有实例化之前,就可以访问objectCount这一静态成员数据。
结论:
1 类没有实例化之前,只要静态成员数据被初始化了,就可以访问,意味着已经在内存中存在
2 如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。
3 如果这个静态成员是结构体,可以直接用{}初始化。
4.如果这个静态成员是public的,那么它可以被其他类访问并改变值。如果它是private的,那么它只能被类内的函数访问并使用。
这个初始化使用的示例见上传的代码包:
https://download.csdn.net/download/xiaodouhao123456/12702003
- 静态函数成员
如果把函数成员声明为静态的,就可以把函数与类的任何特定对象独立开来。
静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符 :: 就可以访问。
静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。静态成员函数有一个类范围,他们不能访问类的 this 指针。您可以使用静态成员函数来判断类的某些对象是否已被创建。
extern
提供一个全局变量/函数的引用,全局变量/函数对所有的程序文件都是可见的。当您使用 ‘extern’ 时,对于无法初始化的变量/函数,会把变量/函数名指向一个之前定义过的存储位置。
mutable
mutable 说明符仅适用于类的对象,这将在本教程的最后进行讲解。它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。
thread_local 存储类
使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
thread_local 说明符可以与 static 或 extern 合并。
可以将 thread_local 仅应用于数据声明和定义,thread_local 不能用于函数声明或定义。用法如下:
在下面的例子中,计算机就会为每个线程开辟一个变量rage的存储空间。
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
thread_local unsigned int rage = 1;
std::mutex cout_mutex;
void increase_rage(const std::string& thread_name)
{
++rage;
std::lock_guard<std::mutex> lock(cout_mutex);
std::cout << "Rage counter for " << thread_name << ": " << rage << '\n';
}
int main()
{
std::thread a(increase_rage, "a"), b(increase_rage, "b");
{
std::lock_guard<std::mutex> lock(cout_mutex);
std::cout << "Rage counter for main: " << rage << '\n';
}
a.join();
b.join();
}
其输出为:
Rage counter for a: 2
Rage counter for main: 1
Rage counter for b: 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)