类(Class)与结构体(struct)/附Static(静态关键字)

一、类

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:设计模式--单例模式需要掌握

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值