类(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();
}
报错
三、两者之间的联系
它们确实没有太大的区别,但是在代码实际使用中确实有所不同。在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了。
请看下面图片里面报错:
可以证明确实 #define struct class 有效。
五、继承
- 我绝对不会使用struct继承,如果真的要用一个完整的类层次或某种继承层次的结构我将会使用class,因为继承又增加了另一层复杂性,而我希望我的结构体仅仅是数据的结构体。
- 混合使用class和struct的话。举个例子,你有一个类叫做A,有一个结构体叫做B,B继承A,此时编译器会发出警告,警告你正在向一个类继承。但是你是一个结构体,还有一些细微的差别。编译器只是警告你,你的代码仍然可以运行。这只是语义上的差别,这就是我使用struct而不是class的原因。如果我只想表示一些数据,我会选择struct。
- 我要实现多功能的话,像游戏里的一个玩家或者可能继承的其他东西,我会使用class。
- 以上就是我区分两者的区别,从继承角度来讲。
- 很多行业里的人也是这么区分的。但是如果技术上来讲,两者除了可见性之外没有什么区别,你可以在任何你使用class的地方使用struct。