结构体和类的区别
struct 默认成员是公有的
log类是用来管理日志信息的一种方式,也就是把我们想要的程序信息打印到控制台上,这一般在调试程序时很有用,在我们的程序应用中,如果你想知道发生了什么,只需要把事物的状态打印到控制台就可以了。
#include <iostream>
#define LOG(x) std::cout << x << std::endl
class Log
{
public:
const int LoglevelError = 0;
const int LoglevelWarning = 1;
const int LoglevelInfo = 2; //默认情况下日志级别设置为LoglevelInfo,
//所有的信息都要被打印
private: //私有变量成员,代表设置的log级别
int m_Loglevel = LoglevelInfo;//m前缀一般表明这是一个私有的类成员变量
public:
void SetLevel(int level) //用整数来代表log的级别
{
m_Loglevel = level;
}
void Error(const char* message) //打印信息到控制台
{
if (m_Loglevel >= LoglevelError)
std::cout << "[ERROR]: " << message << std::endl;
}
void Warn(const char* message) //打印信息到控制台
{
if (m_Loglevel >= LoglevelWarning)
std::cout << "[WARNING]: " << message << std::endl;
}
void Info(const char* message)
//Warn函数有一个字符串指针,使我们要打印的消息
//const char*——字符串
{
if (m_Loglevel >= LoglevelInfo)
std::cout << "[INFO]: " << message << std::endl;
}
};
int main()
{
Log log;
//log.SetLevel(log.LoglevelWarning);
log.Warn("Hello!");
log.Error("Hello!");
log.Info("Hello!");
std::cin.get();
}
static关键字
在类class或者结构体struct外使用static
在类class或者结构体structn内
类外的static修饰的符号在link阶段是局部的,也就是它只对定义它的编译单元(.obj)可见
类内或者结构体内的表示这部分内存是这个类的所有实例共享的,简单来说,就算实例化了很多次这个类或者结构体,但那个静态(static)变量只会有一个实例;类里面的静态(static)方法也是一样的,静态方法里没有该实例的指针。
static在类或者结构体——作用域
static int s_Variable = 5;
static ——表示这个变量在link的时候只在编译单元(.obj)里可见,把这个变量标记为私有的
你定义的函数和变量只对它声明所在的cpp文件是“可见的”
重点:尽量让全局变量和变量用static标记,除非它们必须要用在其他的编译单元里
class或者struct内部的static
class内部的static代表一个特定的东西
如果在类内部定义一个static变量意味着这个类中的所有实例中,这个变量只有一个实例。
通过类实例来引用静态变量是没意义的。
struct的成员变量默认是public
#include <iostream>
struct Entity
{
int x, y;
void Print()
{
std::cout << x << "," << y << std::endl;
}
};
int main()
{
Entity e; //实例化
e.x = 2;
e.y = 3;
Entity e1 = { 5,8 };
e.Print();
e1.Print();
//std::cout << s_Variable << std::endl;
std::cin.get();
}
两个不同的实例x,y变量指向的是同一个共享空间
#include <iostream>
struct Entity
{
static int x, y;
void Print()
{
std::cout << x << "," << y << std::endl;
}
};
int Entity::x;
int Entity::y;
int main()
{
Entity e; //实例化
e.x = 2;
e.y = 3;
Entity e1;
e1.x = 5; //e.x也会改变
e1.y = 8;
e.Print();
e1.Print();
//std::cout << s_Variable << std::endl;
std::cin.get();
}
Entity::x——在Entity内部创建了两个变量
如果你有一条信息想要在所有实例中共享那么将这条信息放在类内部是有意义的,因为它是和类相关的。
静态方法不能访问非静态变量
在类里写的每一个非静态方法都会获得当前的类实例作为参数(指针)