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。
那就是意味着你声明一个引用时,你必须将一个实际的变量赋值给它。那么如果我确实想改变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();
}
结果为:
类(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();
}