深入学习C++——18~19类

11 篇文章 0 订阅

深入学习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));

类的内容又多又杂,将会持续更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范子琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值