Day13
local static
你可以在本地作用域中使用static来声明变量,这个和之前的都不一样,主要不同的在于变量的生命周期和作用域。生命周期的意思就是变量能存活多久,也就是在被删除前在内存中停留多久。 作用域就是我们能在哪里访问这个变量,比如我们在函数内声明一个变量,我们不能在别的函数里访问它,因为我们声明的这个变量相对于声明它的函数是“本地的”。
示例
#include <iostream>
void Function()
{
int i = 0;
i++;
std::cout << i << std::endl;
}
int main(){
Function();
Function();
Function();
Function();
Function();
std::cin.get();
}
这个你没调用一次函数都会重新分配一个内存空间,所以值如下:
如果你写成如下形式:
int i = 0;
void Function()
{
i++;
std::cout << i << std::endl;
}
int main(){
Function();
i = 10;
Function();
Function();
Function();
Function();
std::cin.get();
}
那么变量i就是一个全局变量,你可以在任何地方访问和改变它。当时当你想要这种效果又不想任何地方都能访问到这个变量,你可以改成如下形式:
void Function()
{
static int i = 0;
i++;
std::cout << i << std::endl;
}
int main(){
Function();
Function();
Function();
Function();
Function();
std::cin.get();
}
总结而言:local static的意思就是 相对于别的类来说,这个变量在声明它的类中就是本地的。其实还有很多具体请看https://www.bilibili.com/video/BV1VJ411M7WR?p=23
枚举
枚举由用户定义的若干枚举常量的集合。他的定义格式为:enum <类型名> {<枚举常量表>};
enum Example
{
A,B,C
};
int main(){
std::cin.get();
}
默认状态下,这个整数就是所列举元素的序号,序号从0开始。可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。
enum Example
{
A=5,B=1,C
};
int main(){
std::cin.get();
}
示例
class Log
{
public:
enum Level
{
error = 0, warning, info
};
private:
Level m_LogLevel = info;
public:
void SetLevel(Level level)
{
m_LogLevel = level;
}
void Error(const char* message)
{
if (m_LogLevel>=error)
{
std::cout << "[ERROR]:" << message << std::endl;
}
}
void Warning(const char* message)
{
if (m_LogLevel >= warning)
{
std::cout << "[WARNING]:" << message << std::endl;
}
}
void Info(const char* message)
{
if (m_LogLevel >= info)
{
std::cout << "[INFO]:" << message << std::endl;
}
}
};
int main(){
Log log;
log.SetLevel(Log::error);
log.Warning("Hello");
log.Error("Hello");
log.Info("Hello");
std::cin.get();
}
你可以能注意到了::
。这个是什么东西呢?这个叫域操作符。例如System::Math::Sqrt()相当于System.Math.Sqrt()
。也就是说A::member就表示类A中的成员member. B::member就表示类B中的成员member.
。