一、类
1.定义
类就是对变量和函数进行组织,成为一个类型。
#include <iostream>
class Player
{
public://消除访问控制,使得变量对外界可以访问,否则外部无法访问私有成员
int x, y;
int speed;
void Move(int xa, int ya)
{
x += xa * speed;
y += ya * speed;
}
};
int main()
{
Player player;
player.x = 5;//玩家的初始x坐标
player.Move(1,-1);//玩家的位移过程,这里填的xa和xb应该是指的相对于正向轴的运行时间
std::cin.get();
}
2.类的作用
让程序更简洁,让系统维护更容易,让程序员更轻松。
3.class与struct的区别
1.可见性不同:class是类中私有的,如果想外界访问呢需要加上【public:】, struct是全局公有的,可以直接访问。
2.C语言中没有class,而C++中有struct,所以C++的包容性更强。
3.如果只是需要数据的一个集合,用struct较好;如果需要有一个很多功能的类,甚至需要多个类进行继承,用class。(示例见视频P19)
二、Static
1.作用
限制变量或者函数的作用域,仅在当前cpp文件可见,避免在全局中重复定义。
情况一:全部公开
#include <iostream>
struct Entity
{
int x, y;
void Print()
{
std::cout << x << "," << y <<"\n"<< std::endl;
}
};//由于struct是公开的,房屋类型一样,家居类型一样,但是大家各有各的家,不会重复
int main()
{
Entity e;
e.x = 2;
e.y = 3;
Entity e1 = { 8,10 };
e.Print();//调用结构体的函数来打印
e1.Print();
std::cin.get();
}
打印结果为2,3 和 8,10
情况二:变量和函数都变成结构体静态,则值只有一个(无论用对象访问还是类名访问),并且访问时需要先链接
#include <iostream>
struct Entity
{
static int x, y;
void static Print()
{
std::cout << x << "," << y << std::endl;
}
};//加上static,意思电视和沙发只有一件,谁最后买就归谁,但是关上了门,大家不知道有x和y
int Entity::x;
int Entity::y;//使得内部变量可以和外界连接,也类似于向外界声明了有x和y的存在。
int main()
{
Entity e;
e.x = 2;
e.y = 3;
//正确形式为Entity::x=2;也即底层真正的变化
//正确形式为Entity::y=3;
Entity e1;
e1.x = 8;
e1.y = 10;
//正确形式为Entity::x=8;
//正确形式为Entity::y=10;
Entity::Print();
Entity::Print();
std::cin.get();
}
打印结果为8,10 和 8,10.因为只有一个私有房间,谁最后住,东西就是谁的。
好处:可以让所有实例中共享数据。
情况三:只有一个静态方法则静态方法无法访问非静态成员变量,有误
#include <iostream>
struct Entity
{
int x, y;//菜大家共有
void static Print()
{
std::cout << x << "," << y << std::endl;
}//有误,静态方法中无法访问非静态成员变量,类似于锁住的私人铁锅无法做别人的菜
};
int main()
{
Entity e;
e.x = 2;
e.y = 3;
Entity e1;
e1.x = 8;
e1.y = 10;
Entity::Print();
std::cin.get();
}
情况四:针对cpp文件静态的方法,这里就类似于一个普通函数了
#include <iostream>
struct Entity
{
int x, y;
};
void static Print(Entity e)
{
std::cout << e.x << "," << e.y << std::endl;
}
int main()
{
Entity e;
e.x = 2;
e.y = 3;
Entity e1;
e1.x = 8;
e1.y = 10;
Print(e);
Print(e1);
std::cin.get();
}
打印结果为2,3 和 8,10
类内声明,需要类外链接+初始,并且共享共一份数据。
类内private的静态数据,无法在类外访问。
三、总结
1.static修饰全局变量时,该变量仅在该cpp内可见。extern关键字表明:此变量/函数是在别处定义的,要在此处引用。
2.static修饰局部变量时候,以自增函数为例,定义时若未赋值则默认为0,且值不变,类似于全局变量,即使再次被初始化了,重新调用函数时候也不会重新被赋值。
#include <iostream>
#define LOG(x) std::cout<<x<<std::endl
void Function()
{
static int i;// i=0
i++;
LOG(i);
}
int main()
{
Function();//打印i=1
Function();//打印i=2
int i = 10;//无效操作
Function();//打印i=3
Function();
std::cin.get();
}
3.static修饰函数时候,为专属的,不可以访问外部(非静态)变量。
ps:设计模式--单例模式需要掌握