C++学习笔记(第一篇)
一、观看YouTube的C++视频笔记
国内教学视频真的是又臭又长,感觉讲课讲的明白不是本意,讲的让同行挑不出理才是关键,并且专攻概念不攻原理,奈何我基础薄弱不堪重负,遂看国外视频破罐子破摔了。本文纯属个人理解,如果大佬发现有错欢迎指出。
二、 指针
指针只是一个存储着内存地址的整数,变量前加 & 表示这个变量的地址,地址前 *表示这个地址所对应的存储空间。
int var = 8; //var所在存储空间内存储的int型号值是8
int* ptr = &var //ptr的值为var所对应的存储空间的地址,这句话声明了该地址存储空间的属性
*ptr = 10 //将这个存储空间内存放的数改为10,因此var存放的值也变为10,*ptr相当于是var的另一种表示方法
三、引用
1.引用时建立在指针原理之上的另一种应用。
void Increment(int value)
{
value++;
}
void main()
{
int a = 5;
Increment(a);
}
上面的程序执行完成后输出a的值依然为5,因为上面的子函数执行的操作实际上是:建立了一个与a值相同的变量value,并对value进行自增,与a完全没关系。因此想要通过上面的子函数改变a的值可以写成下面这样。
void Increment(int& value)
{
(*value)++;
}
void main()
{
int a=5;
Increment(&a);
}
但是上面这样看起来就很不友好,于是采用引用的方法,则上面的代码可以优化为:
void Increment(int& value) //对主函数传上来的存储空间进行引用
{
value++;
}
void main()
{
int a = 5;
Increment(a);
}
这样最终输出的a的值变为了6。不要一看到&就认为是取地址,也可能是引用。
2.注意:
(1)int&不是&贴着int,int&本身就是一种变量类型。
(2)一旦声明了引用就不能跟换他所引用的对象。
(3)声明一个引用时一定要将一个实际的变量赋值给它,不能只声明不赋值,因为引用不是真的变量。
int main()
{
int a = 5;
int b = 8;
int& ref=a;
ref=b //这样做的结果是将b的值赋给了a,最终a,b的值都为8
}
四、类与面向对象编程、实例、方法
在一个游戏中要讲人物作做对象去编程(例如人物行走)需要传递很多变量(例如坐标,速度等),但是游戏中有很多人物,如果每个类似的函数都要传递很多参数那么程序会很不友好(想象一个函数传递30个参数)。因此人们会将包含参数相同的模型归类,由此产生了类的概念。C语言的结构体就相当于是C++中的类,如果说类和结构体有什么不同,那不同点就是结构体中的参数默认对整个程序公开,而类中的结构体默认不公开其他函数想要访问需要手动设置。
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);
}
我们可以将和类有关的函数放入类中,这样就如下图:
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);
}
用类作为类型设的变量就是实例,类中的函数就是方法