一、吐槽
我好累,我好累,我好累。。。我不想学习,我想躺平
二、static的应用
(1)类和结构体外面的static:
static表示这个变量在link时只有在这个编译单元(.obj)可见。
(2)类和结构体里面的static:
static表示一个特定的东西,就像是类的全局变量。无论是哪个实例用到这个变量本质上都是操作同一块内存空间。一个类本质上只有一个实例,当你新建类的实例时并不会重新分配内存。
/*假设Entity是一个类,x、y都是这个类中的static变量*/
int Entity::x;
int Entity::y; //不在类外面进行声明则会因为是static变量而报错
int mian()
{
Entity e;
e.x=2; //本质是Entity::x=2
e.y=3; //本质是Entity::y=3
Entity e1;
e.x=4; //本质是Entity::x=4
e.y=5; //本质是Entity::y=5
} //输出的e和e1的x、y的值都是4、5因为操作的都是同一个空间
(3)局部作用域里的static:
声明变量时要考虑两点,生存空间和作用域。生命周期的意思是变量实际的存在时间,也就是变量在被删除前在内存停留的时间。作用域是指我们可以访问这个变量的范围。
void function()
{
static int i =0;
i++;
std::cout << i << std::endl;
}
void main()
{
function();
function();
function();
function();
std::cin.get();
}
上面的程序如果子函数中i不加static则最终会输出四个1,因为不加static变量i的生命周期是在子函数结束。加static则最终会输出1,2,3,4,因为变量加了static生命周期变成了永久。
三、枚举
定义枚举类型的目的只要是为了增加程序的可读性,我们希望可以定义一种数据类型,使它的值只能在已有的范围并且将这些数据组合起来,这时就用到了枚举。
enum example
{
A=5,B,C //注意没有分号,并且如不赋值默认依次为0,1,2。像现在这样赋值则为5,6,7
};
四、构造函数
构造函数是一种特殊的函数,会在每次实例化的时候调用,最主要的用处是初始化类,当你创建一个对象实例时要确保初始化了所有的内存和做了所有你需要的设置,否则就会被设置为之前留存在内存中的值。构造函数不会在你没有实例化对象时进行,所以如果使用类的静态方法则构造函数不会执行。函数重载就是相同的函数名有不同的参数的不同版本函数。
class Entity
{
public:
float X,Y;
Entity( )
{
} //这三行就是构造函数
Entity(float x,float y )
{
X=x;
Y=y; //这三行就是函数重载
}
};
五、析构函数
构造函数在创建一个对象实例时候运行,而析构函数是在销毁一个对象的时候运行。在任何时候当一个对象被销毁的时候,析构函数都会被调用。在用new关键字创建一个对象(存在于堆上),然后使用delete时析构函数会被调用;如果只有基于栈的对象,当跳出作用域的时候对象也会被删除,所以这时候析构函数也会被调用。
class Entity //创建类
{
public:
float X,Y;
Entity( ) //构造函数
{
X =0.0f;
Y = 0.0f;
std::cout << "Created Entity!" <<std::endl;
}
~Entity( ) //析构函数
{
std::cout << "Deatroyed Entity!" <<std::endl;
}
void Print( )
{
std::cout << X << "," << Y <<std::endl;
}
};
void Function( )
{
Entity e; //调用构造函数,输出Created Entity!
e.Print( ); //输出0,0
}
int main( )
{
Function( ); //基于栈的对象,跳出作用域时调用析构函数,输出Deatroyed Entity!
std::cin::get();
}
/***********************输出为***********************************/
Created Entity!
0, 0
Deatroyed Entity!