C++学习Day10——引用、类

本文详细讲解了C++中的引用概念,如何使用引用避免值拷贝,以及类的定义与对象实例化,重点阐述了引用的使用技巧和类在数据组织和封装中的作用。通过实例演示了指针和引用在函数参数传递中的区别,以及类的成员函数和访问控制。
摘要由CSDN通过智能技术生成

Day1

reference(引用)

什么是引用

引用就是指针,引用只是基于指正的一种高级修饰,来使代码更易读。引用就是指对某个已经存在的变量的引用。 换句话说就是"引用变量"必须引用一个已存在的变量,它本身并不是一个新变量,他们并不真正占用内存。

引用示例
int main(){
	int a = 5;
	int* b = &a;//&加上已经存在的变量指向它的内存地址
	int& ref = a;
	/*在这&符号实际是变量类型的一部分,并不是有&的就一定是指正或一定
	是引用,需要看前后的字符是什么,在这因为他挨着变量类型,所以是引用*/
	std::cin.get();
}

现在我们创建了一个叫做ref的别名,也即是ref这个引用指向的是变量a所在的地址。

#define Log(x) std::cout<<x<<std::endl

int main(){
	int a = 5;
	int* b = &a;
	int& ref = a;
	ref = 2;
	Log(ref);
	Log(a);
	std::cin.get();
}

引用
当我们改变ref的值的时候,实际改变的是a所在的地址的存储的值。
我们创建一个函数,想让值递增。

void incream(int val)
{
	val++;
}

int main(){
	int a = 5;
	incream(a);
	Log(a);
	std::cin.get();
}

现在传入的不是一个指针或者引用,只是进行值调用,在调用过程中,是把a存储的值拷贝一份传到函数中,就会直接创建一个全新的变量val。所以我们需要用的是引用传递这个变量来让他递增。那该如何做呢?做法就是我们不把值传入函数,而是直接 传递 a这个变量的地址。因为我们可以在函数内找到这个变量地址,看到数字5在加以修改。就是通过内存地址完成写入。有如下两种方式:
1.利用指针

void incream(int* val)
{
	(*val)++;
}

int main(){
	int a = 5;
	incream(&a);
	Log(a);
	std::cin.get();
}

你会看到值发生了改变
传递地址
2.利用引用

void incream(int& val)
{
	val++;
}

int main(){
	int a = 5;
	incream(a);
	Log(a);
	std::cin.get();
}

你会发现值也变成了6。
值改变
重要声明:一旦你声明了一个引用,你就不能改变她所引用的对象。比如一下例子:

int main(){
	int a = 5;
	int b = 8;

	int& ref = a;
	ref = b;
	//incream(a);
	Log(a);
	std::cin.get();
}

现在你把a赋值给了ref,然后你又把b赋值给了ref,最后你会发现a和b都变成了8。
a和b都改变
那就是意味着你声明一个引用时,你必须将一个实际的变量赋值给它。那么如果我确实想改变ref所指代的值是什么该怎么办?
我们需要创建一些变量使得它先指向a,然后在让它指向b。其实也就是使用指针。

int main(){
	int a = 5;
	int b = 8;

	int* ref = &a;
	*ref = 2;
	ref = &b;
	*ref = 1;
	//incream(a);
	Log(a);
	Log(b);
	std::cin.get();
}

结果为:
a=2,b=1

类(class)

什么是类

简而言之,类就是将数据和函数组织在一起的方式。例如:在一个游戏中,我们希望以某种方式代表玩家,所以我们需要怎么做去表示一个玩家呢?我们一定需要一个表示玩家位置的数据,而且角色还可能有其他属性,比如移动的速度。我们可能还需要3D模型来在屏幕上显示玩家,所有的数据都需要存在某个地方,我们可以为这些数据创建变量。


int main(){
	int playerX0, playerY0;
	int speed0 = 2;
	int playerX1, playerY1;
	int speed1 = 2;
	std::cin.get();
}

playerX0和playerX1代表两个玩家,当你有多个的时候会很麻烦,你可能会想到用数组,但是这些都是一堆无组织的变量充斥在代码中,这并不好。另一个就是你想用函数代表玩家移动,那么你就会产生很多的代码,很难维护。我们可以用类来简化这一步。我们可以为玩家创建一个类,叫做player,一次性包含所有想要的数据,最终作为一个类型。

//定义
class Player
{
	int x, y;
	int speed;
};

int main(){
	Player player;//实例化
	std::cin.get();
}

由类类型制成的变量叫做对象,新创建对的过程叫做实例化。如果我们想设置这些变量,我们可以简单地写player.x如果我们直接访问的话,编译器直接会报错,因为类中的属性/变量默认都是私有的,这还牵扯到一个叫做访问控制的概念。所以你需要改成如下形式:

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

public表示公共的,我们可以在类的外部访问。接下来我们可以使用一个函数来改变x,y的值。

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

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);
	std::cin.get();
}

其实还有一个种更好的办法,类中可以包含函数,这个函数被称为方法,这就意味着我们可以把move函数放在Player类中。也就是可以改成如下形式:

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(1, -1);
	std::cin.get();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值