#学习自用#
静态
局部静态
在讲局部静态前,我们要了解变量的生命周期,在一个函数内的定义变量称为局部变量,这个变量的生命周期仅在函数执行期间,函数执行结束后这个变量就会被销毁。而函数内部的静态变量会一直存在于程序的整个生命周期中,程序结束时才会被销毁,静态变量只会初始化一次。
#include<iostream>
using namespace std;
void add()
{
static int p=0;
p+=1;
cout<<p<<endl;
}
void main()
{
int i=0;
add();
add();
cin.get();
}
如果去掉static 两次打印的结果均为1,这里虽然p在函数结束后没有被销毁,因为p的生命周期是从第一次定义开始到程序结束,所以打印结果为1和2;但是在第二个add处添加断点进行调试,内存中却看不到p的地址(希望有大佬能解释一下为什么看不到地址)。
枚举
枚举是将一组整数值集合作为类型,第一个数默认为0,往后依次递增1。
#include<iostream>
using namespace std;
enum example: unsigned char
{
A,B,C=3,d
};
void main()
{
cout<<A<<endl;
cout<<B<<endl;
cout<<C<<endl;
cout<<d<<endl;
cin.get();
}
如果变量有赋值,该变量值改变,往后按改变后的值依次递增1,所以输出0,1,3,4 。枚举类型默认整型,如果变量数值不大就没有必要用32位的整型,将其改为8位整型可以节省内存。
构造函数
构造函数是一种特殊类型的方法,每次构造一个对象时都会被调用,它没有返回值类型,其名必须与类的名称相同,如果不实例化对象构造函数就不会运行。构造函数的特性对于初始化来说比较方便。
#include<iostream>
using namespace std;
class player
{
public:
float x,y;
player(float i, float j )
{
x=i;
y=j;
}
player()
{
x=0;
y=0;
}
void print()
{
cout<<x<<endl;
cout<<y<<endl;
}
};
void main()
{
player p1(1.0f,1.0f);
player p2;
p1.print();
p2.print();
cin.get();
}
一个类中可以有多个构造函数,但多个构造函数名称相同,所以必须保证参数不同才能区分不同的构造函数,例子中p1调用了第一个构造函数,p2调用第二个。
析构函数
析构函数是在销毁对象时运行,用于清理使用过的内存。在构造函数中进行了数据初始化,如果不清理可能会导致内存泄漏。~类名称即为解析函数。
继承
两个不同的类,但是有许多相同的公共部分(变量,函数),就可以通过继承去减少代码的重复。
比如:游戏中的子弹,需要有位置信息,有移动;对于玩家同样需要位置信息,需要可以移动,还需要游戏id。
class cartridge
{
public:
float x,y;
void move(float i,float j)
{
x+=i;
y+=j;
}
};
class player:public cartridge
{
const char* name;
};
player中就包含了cartridge中的变量以及函数。