C/C++类(Class) Vs 结构体(Struct)

假如C++ 中有两个术语,一个是类(Class) 另一个是 结构(Structure);什么时候使用 Class呢?什么时候使用 Stucture呢?下面我将为你解答!

其实他们两者没有什么区别的。只有一个很小的区别。class默认private,struct默认public。引入struct是为了让C++向后兼容C。

一、类(Class)

性质:私有的(private)

#include<iostream>

#define LOG(x) std::cout << x << std::endl;

class Player
{
public:
	int x, y;
	int speed;

	void Move(int xa, int ya)
	{
		x += xa * speed;
		y += ya * speed;
	}
};

//void Move(Player& player, int xa, int ya)
//{
//	player.x += xa * player.speed;
//	player.x += ya * player.speed;
//}

int main()
{
	Player player;
	player.x = 5;
	player.Move(1, -1);

	std::cin.get();
}

要点

  • 函数外部调用的话简便方法是在类里面加上 public
  • 如果你没有任何指定类型的可见修饰符,类的成员是不可见的。或者你没有指定任何内容,,默认就是私有的。然而stuct默认是(public)的, 这就是 struct 和 class的唯一区别。
二、结构(Struct)

性质:共有的(pulic)

#include<iostream>

#define LOG(x) std::cout << x << std::endl;

struct Player
{
	int x, y;
	int speed;

	void Move(int xa, int ya)
	{
		x += xa * speed;
		y += ya * speed;
	}
};

//void Move(Player& player, int xa, int ya)
//{
//	player.x += xa * player.speed;
//	player.x += ya * player.speed;
//}

int main()
{
	Player player;
	player.x = 5;
	player.Move(1, -1);

	std::cin.get();
}

如果我们在class里面写 private 的话,那么结果是和 class 默认情况下一样。

#include<iostream>

#define LOG(x) std::cout << x << std::endl;

struct Player
{
// 成员变量和class一样,是私有的    
piavete:
	int x, y;
	int speed;

	void Move(int xa, int ya)
	{
		x += xa * speed;
		y += ya * speed;
	}
};

//void Move(Player& player, int xa, int ya)
//{
//	player.x += xa * player.speed;
//	player.x += ya * player.speed;
//}

int main()
{
	Player player;
	player.x = 5;
	player.Move(1, -1);

	std::cin.get();
}

报错

image-20240301112532073

三、两者之间的联系

它们确实没有太大的区别,但是在代码实际使用中确实有所不同。在C++中结构体存在的为唯一原因是因为他们要维持与C之间的兼容性,因为C中没有类,然而他有结构体,如果我们突然彻底删除 stuct 这个关键字,那么我们就会降低它的兼容性。C++的编译器不知道什么是struct,当然你可以通过使用 ”#“ 来很容的修复它。

四、# 在class 和 stuct转换

我们可以使用 #define stuct class 把struct 转换成 class

#include<iostream>

#define LOG(x) std::cout << x << std::endl;
#define struct class

struct Player
{
	int x, y;
	int speed;

	void Move(int xa, int ya)
	{
		x += xa * speed;
		y += ya * speed;
	}
};

//void Move(Player& player, int xa, int ya)
//{
//	player.x += xa * player.speed;
//	player.x += ya * player.speed;
//}

int main()
{
	Player player;
	player.x = 5;
	player.Move(1, -1);

	std::cin.get();
}

要点:

通过 #define struct class,我们把 struct 转换成了 class了。

请看下面图片里面报错:

image-20240229210458940

可以证明确实 #define struct class 有效。

五、继承
  • 我绝对不会使用struct继承,如果真的要用一个完整的类层次或某种继承层次的结构我将会使用class,因为继承又增加了另一层复杂性,而我希望我的结构体仅仅是数据的结构体。
  • 混合使用class和struct的话。举个例子,你有一个类叫做A,有一个结构体叫做B,B继承A,此时编译器会发出警告,警告你正在向一个类继承。但是你是一个结构体,还有一些细微的差别。编译器只是警告你,你的代码仍然可以运行。这只是语义上的差别,这就是我使用struct而不是class的原因。如果我只想表示一些数据,我会选择struct。
  • 我要实现多功能的话,像游戏里的一个玩家或者可能继承的其他东西,我会使用class。
  • 以上就是我区分两者的区别,从继承角度来讲。
  • 很多行业里的人也是这么区分的。但是如果技术上来讲,两者除了可见性之外没有什么区别,你可以在任何你使用class的地方使用struct。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值