- 博客(32)
- 收藏
- 关注
原创 Unity的射线检测条件
具体来说,Unity提供了射线类(Ray)以及相关的函数接口来实现这一功能。射线是从一个点沿一个方向发射的一条无限长的线(在Unity中,实际上可以通过设置射线的最大长度来限制其无限性),当射线与碰撞器发生碰撞时,它会根据碰撞信息类(RaycastHit)来存储碰撞的详细信息,如碰撞点、法线、碰撞器等。因此,对于问题“unity射线是碰着碰撞体停止还是碰到物体”,答案是:射线在Unity中是碰到添加了碰撞器的模型(即碰撞体)时才会停止发射,而不是碰到场景中的任意物体都会停止。
2024-10-21 09:49:25
264
原创 C++模板template(二十一)
在C++的模板体现了一种泛型编程的思想,当我们不确定要传入的参数是何种数据类型时我们可以写一个模板类型来代替,当传入参数时才将类型告诉它。模板也是属于一种静态多态,,模板的不同类型发生在编译时。:不是针对某一个具体的类型编程,而是对一类类型进行编程。
2024-04-20 21:00:24
263
原创 C++智能指针(二十)
与shared_ptr不同的是,某个时刻只能有一个unique_ptr指向一个给定的对象。在析构的时候释放资源。比如:我们创建一个文件读写的类,当我们通过类创建一个栈对象时,并初始化传入要打开文件的指针,当我栈对象的生命周期结束会自动调用析构函数将文件关闭,这就为我们解决一些文件未close的安全问题。总结:这里pt本身不是指针,但他具备指针的功能,我们是用pt对象来托管new Point(1,2)这块堆空间,当pt对象的生命周期结束,自动调用析构函数,我们在将这块托管的堆空间释放。头文件
2024-04-20 20:28:54
2466
2
原创 C++基础之验证虚表的存在(十九)
通过内存布局我们可以知道在普通继承时,派生类Derived继承Base时虚表位于前8个字节,然后是Base的数据成员其次是派生类的数据成员。通过这个特性我们可以通过指针访问对象中的任意一个数据成员和虚表中的函数。
2024-03-30 16:43:28
260
2
原创 深度理解C++多继承和多态
因此我们用基类指针指向派生类对象的时候,他指向的其实是派生类对象中虚表的地址。这时B中只有两个虚函数,由于C中没有b虚函数那他就会继承b的虚函数放入虚表;C中有a的虚函数就将B中的虚函数重写放入虚表,此时B中剩了两个普通成员函数,这时我们调用B类型的指针,如果指向虚函数他就会指向C虚表中的函数,非虚函数就会指向B中的普通成员函数。根据上述代码我们可以知道,我们用类C去继承类A和类B,其中基类A的成员函数abc均为虚函数,在类B中我们将ab设为虚函数,cd设为普通成员函数。这时我们让C去继承A和B。
2024-03-30 14:33:55
968
1
原创 C++基础之虚函数(十七)
概念:首先虚函数是存在于类的成员函数中,通过virtual关键字修饰的成员函数叫虚函数。性质:如果在基类中定义类的虚函数,那么在派生类中该函数被继承下来仍是虚函数,即使派生类中没有加virtual重写(覆盖):派生类要保证该虚函数的名字,返回类型,参数列表都要相同。
2024-03-28 18:17:58
1069
原创 C++基础之继承(十五)
当一个派生类继承一个基类时,需要在派生类的类派生列表中明确的指出它是从哪个基类继承而来的。类派生列表的形式如下:class 派生类: public/private/protected 基类。
2024-03-25 09:36:06
340
原创 C++基础之写时复制(十四)
当释放内存时等到只有一个指针指向“Hello,World”时,才用delete将该快内存释放。在我们进行字符串复制时用的都是深拷贝,如果用浅拷贝会导致double free问题,这时因为我们两个指针指向了同一块内存空间,当进行析构函数释放内存空间时就会同一块内存释放两次。但是由于深拷贝的效率要比浅拷贝慢很多,如果我们只是去读数据时我们可以只用浅拷贝,等到写数据时用深拷贝,这就是写时复制。当我们要写数据时,就进行深拷贝,创建一块新的堆空间将str5指向这块堆空间。
2024-03-22 20:15:56
171
原创 C++基础之运算符重载(十一)
首先为什么要对运算符进行重载?因为C++内置的运算符只能作用于一些基本数据类型,而对类和结构体这种自定义数据类型是不管用的。所以这时我们需要对运算符进行重新定义满足一定的运算规则。
2024-03-20 13:40:14
336
1
原创 C++基础之友元(十)
1.友元的声明是不受关键字private,public,protect限制的,并且友元的关系是不能传递的2.友元是单向的,如A是B的友元,但B不一定是A的友元3.友元关系不能被继承。由于友元会破坏类的封装性,所以要谨慎使用。
2024-03-20 10:49:55
523
1
原创 C++基础之输入输出流(九)
首先什么是流,流是一个字节序列,而程序的输入输出就发生在流中。如果字节流是从设备(如键盘)流向内存,那么就叫他输入流。如果字节流从内存流向设备(如显示屏),那么就叫做输出流。所以在我们判断是否是输出流还是输入流,只需要看文件是否是流向内存,还是从内存流出。
2024-03-18 14:19:43
2211
3
原创 C/C++内存对齐
结构体或联合体的数据成员,第一个数据成员要放在offset(偏移量)为0的地方,以后每个数据成员都按照数据成员大小的整数倍存储。此时内存的存放规则是,其中AA结构体中a占4个字节(0,1,2,3),b占1个字节(4),c占2个字节但是不能在第5个字节存,因为最小整数倍是6,所以只能空一个字节在第6个开始存short,然后d存4个字节(0,1,2,3),最后结构体对齐,结构体大小是结构体最大数据成员的整数倍,其中最大数据成员是int(4字节)所以最后就是12。d d d d。
2024-03-11 16:30:17
254
原创 C++基础之this指针(八)
可以看出在静态成员函数,由于没有this指针我们并不可以在静态成员函数中调用对象中其他的非静态成员函数和非静态数据成员,这个可以类比python中的静态方法。关于this指针首先它存在与类中每个非静态函数里,指向对象本身并且不能被修改是一个指针常量,类似python中的self,用它来标记每个不同对象。在C++中我们通过static关键字来定义静态成员函数,首先再看静态成员函数之前我们先看一下静态数据成员。在类外调用静态成员函数时有两种方法,一种是通过对象调用另一种是通过类名和作用域限定符的形式。
2024-03-11 12:32:15
270
原创 C++基础之赋值运算符函数(七)
当我们通过Computer类来创建两个对象com1和com2时当执行赋值时,将对象com2赋给com1时会自动调用赋值运算符函数,也可写成com1.operator(com2);这时com1._name和com2._name指向了同一块内存空间,当com1调用析构函数时就已经将那块堆空间销毁了,而com2调用析构函数时会继续释放那块堆空间,这就会导致一个双重释放(double free)的问题。首先在Computer类中_name我们申请了堆空间,如果直接_name=com._name;
2024-03-10 21:15:14
330
1
原创 C++基础之类的构造函数,拷贝构造函数以及析构函数(六)
类在C++中和结构体类似都是自定义数据类型,在C++中将C中的结构体的功能进行了升级,不仅可以包含一些基本数据类型和函数声明,还可以进行函数的定义。class能做的事struct也可以做,区别是class默认访问权限事private,struct默认事public。
2024-02-09 18:08:00
768
1
原创 C++基础之函数重载(五)
函数重载:指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。将上面的文件编译成目标文件可以看出将函数名后面加上了参数类型,将原函数名进行了改编所以可以根据不同参数调用不同函数。函数重载的原理:当用同名函数时会根据参数类型,参数个数以及参数顺序对函数名字进行改编。其中参数不同包括参数的个数不同,参数的类型不同,不同类型的顺序不同。
2024-02-01 14:28:44
202
1
原创 C++基础之引用(四)
引用:其中就是给一个变量起一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。可以看出引用和变量的地址相同,也就是变量的另一个名字。引用提出来的目的就是为了减少指针的使用。我们知道在对函数值传递是不会改变原变量的值的,这时我们可以传递一个变量的引用来解决这个问题。因此当引用作为返回值的前提就是要返回实体的声明周期要大于函数周期。综上所述,引用的本质就是一个指针常量,一经初始化就不能在改变。
2024-02-01 13:29:27
326
1
原创 C++基础之new和delete以及C语言的内存管理(三)
在内存四区中我们能手动申请的只有堆区空间,栈区、全局区和代码区都是自动分配和释放。因此我们只需对堆区进行动态内存管理
2024-01-31 17:00:59
292
原创 C++基础之指针函数和函数指针,数组指针和指针数组以及const的用法(二)
定义一个常量的方法有两种,一种是通过宏定义来创建一个常量,另一种就是通过const修饰来创建一个常量。而const常量有具体的类型,在编译期会执行类型检查。有几个易混淆的概念,分别是指针常量和常量指针,函数指针和指针函数,数组指针和指针数组。对于指针数组,最经典的就是c语言中的字符串数组,数组中的每个指针指向字符串的首地址。通过gcc将上图文件输出成预处理之后的文件发现,在预处理阶段将内容替换。常量指针,表示指向常量的指针,也就是指针的指向是”不可改变的“指针常量,表示指针是常量,也就是地址是常量。
2024-01-31 14:20:53
297
原创 C++基础之命名空间(一)
命名空间又称为名字空间,是程序员命名的内存区域,程序员根据需要指定一些有名字的空间域,把一些全局实体分别存放到各个命名空间中,从而与其他全局实体分隔开。通俗的说就是,每一个名字空间都是一个独立的空间域,只要你不取使用这个空间域的话,程序是找不到这块空间内的内容的。我们把命名空间的内容叫做。
2024-01-30 20:40:29
517
2
原创 Linux基本命令(二)
sudo useradd test 创建一个test用户但是没有密码和家目录选项 -m 自动创建用户在home下主目录,主目录的名字就是用户名-g 指定用户所属组/etc/passwd 用来保存用户信息/etc/shadow 用来保存用户密码/etc/group 用来保存系统中的所有组id命令 用来查看用户信息sudo passwd test 给test用户设置密码。
2024-01-28 20:17:12
318
原创 c语言中字符串的一些处理方法
可以看出strlen()函数的返回值是size_t类型,其中size_t是typedef定义的无符号整数类型。而这函数的参数为字符串的首地址。我们来简单的实现一下这个函数的过程。
2024-01-18 15:52:04
457
1
原创 递归问题的理解
举个例子,比如你在一个大的阶梯教室,你要想知道你是在第几排(当然你只能看见你前一排的人),你肯定会问你前一排的人是第几排,而你前一排的人肯定也不知道是第几排然后他就得继续向前一排的人问,直到问到第一排这一过程就是递的过程。因为只有第一排的人知道他是第一排,然后在依次往回传,这就是归的过程。1.可以将一个大问题分解成若干个小问题,并且每个小问题的求解和大问题的求解方式一样。这个过程就是递的过程。2.然后将这些问题的解合并成大问题的解,这就是归的过程。3.需要注意的就是边界条件也就是递的终止条件。
2024-01-17 14:06:55
513
原创 Linux的基本命令(一)
rm命令表示remove移除,当删除文件夹时后面加-r参数,无论文件夹内有没有文件都会删除。find -name +文件名,查找当前目录下以及子目录下文件,然后返回查找到文件的路径。后面跟的参数有-a表示当前文件夹的所有文件包括隐藏文件,-l表示列出文件的详细信息。当然也可将加多个参数,其中-h是增加可读性,将字节转化为k,m等单位。cp命令,cp [参数] [要拷贝文件路径] [新文件路径]ls命令是list的缩写,表示是列出当前文件夹的所有文件。mv命令,mv [要移动文件路径] [新文件路径]
2024-01-16 19:45:09
355
1
原创 arduino ide+esp32-cam基于点灯科技blinker实现手机监控
首先在arduino ide上下载最新的blinker库http:// https://github.com/blinker-iot/blinker-library/archive/master.zip解压之后放在arduino的库的文件夹中,再附加开发板库的网址中填入https://dl.espressif.com/dl/package_esp32_index.json,完成后点击“好”,再在开发板管理器中找到esp32的板库进行安装,如果安装失败再重新安装,重复几次后即可安装成功。或者下载es.
2021-09-18 18:42:51
11771
46
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人