深入学习C++——18~19类
18.类的基础认识
与C语言不同,C++支持面向对象编程,因为C语言没有类、对象这些概念。
类是对数据和功能组合在一起的一种方法。如果在游戏中需要一些代表角色的东西,就需要一堆变量。如果这时有两个人物,就要把同样的代码复制两份。这样一来代码会非常混乱且重复,难以维护。使用类可以简化,创建一个叫做player的类:
class Player
{
int x, y;
int speed;
};
类的本质是一个类型,可以把他当成其他变量来创建。我们使用Player player;
创建一个新变量叫做player,类型为Player。由类这种类型构成的变量称为对象,新的对象变量称为实例。这一句所做的是实例化了一个Player对象。若需给变量赋值,使用player.
加变量名即可访问。
int main()
{
Player player;
player.x = 5;
}
这时会报错error: 'int Player::x' is private within this context
,这是因为x实际上是私有成员。类中的内容有可见性这一说,默认情况下一个类中所有的东西都是私有的(private),意味着只有类中的函数才能访问这些变量。如果需要在类外访问这些变量,我们需要将其设为公有的(public):
class Player
{
public:
int x, y;
int speed;
};
此时如果需要写一个函数来操作x和y,需要使用引用传递,因为需要修改Player对象:
void Move(Player& player, int xa, int ya)
{
player.x += xa * player.speed;
player.y += ya * player.speed;
}
int main()
{
Player player;
Move(player, 1, -1);
}
类实际上也可以包含函数,类内的函数称为方法。将move函数移动到类中,此时不需要传入player对象,因为已经在Player对象中了。所有的player.
也都不需要了,他们指的就是当前对象的变量。main函数中使用player.Move(1, -1);
来调用方法。
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.Move(player, 1, -1);
}
综上,类允许我们将变量分组到一个类型中,并为这些变量添加功能。类并没有为变量提供什么新功能,不能用一般代码完成的工作用类同样无法完成。类只是提高了我们维护代码的效率。
19.类与结构体的对比
结构体(struct)和类(class)基本上没有什么区别,只有一个关于可见度的小区别,class中默认为private,而struct中默认为public。除此之外没有任何区别,C++中存在结构体的原因是为了与C保持向后兼容性。
什么时候该用结构体?什么时候该用类?从定义上来看,如果你需要类内变量都是private的那就用class,反之用struct。不过从经验上来谈,如果只是想表示一堆数据,那就用结构体。如果需要大量功能且需要继承,那就用类。这只是个人见解,这两者只是在语义上有可见性的区别,没有严格的规定,如何使用全看个人编程风格。
class MyClass
{
int x, y;
};
struct MyStruct
{
int x, y;
};
类与结构体的初始化和赋值
变量的赋值和初始化是不一样的,初始化是在变量定义的时候完成的,是属于变量定义的一部分,赋值是在变量定义完成之后想改变变量值的时候所采取的操作。
下面拿结构体举例子:
初始化
如果结构体没有构造函数,可以用指定初始化
与顺序初始化
//没有构造函数的结构体
struct MyStruct
{
int x, y;
};
//指定初始化 注意在c++中,顺序不能变。
MyStruct ms = {.x = 2, .y = 3};
MyStruct ms = {x:2, y:3};
//顺序初始化
MyStruct ms = {2, 3};
C++的结构体也可以有构造函数,如果有构造函数则可以用构造函数初始化:
//有构造函数的结构体
struct MyStruct
{
MyStruct(int x,int y)
{
this->x=x;
this->y=y;
};
int x, y;
};
//构造函数初始化
MyStruct ms(2, 3);
赋值
//依次给每一个结构体成员变量进行赋值
MyStruct ms;
ms.x = 2;
ms.y = 3;
//错误!结构体变量的赋值不能采用大括号方式
MyStruct ms;
ms = {2, 3};
//使用现有结构体变量给另一个结构体变量赋值
MyStruct ms = {2, 3};
MyStruct ms1;
ms1 = ms;
//结构体初始化后默认为随机值,初始化后置空用memset
MyStruct ms;
memset(&ms, 0, sizeof(ms));
类的内容又多又杂,将会持续更新