C++程序设计-大模型思维与实践课件 第12章 类与对象(一)-进阶内容_第1页
C++程序设计-大模型思维与实践课件 第12章 类与对象(一)-进阶内容_第2页
C++程序设计-大模型思维与实践课件 第12章 类与对象(一)-进阶内容_第3页
C++程序设计-大模型思维与实践课件 第12章 类与对象(一)-进阶内容_第4页
C++程序设计-大模型思维与实践课件 第12章 类与对象(一)-进阶内容_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十二章类与对象(一)-进阶内容C++程序设计——大模型思维与实践内容导航单参构造函数的类型转换功能结构体简介大模型实践大模型探究单参构造函数的类型转换功能3单参构造函数的类型转换功能在C++中,构造函数不仅用于对象的初始化,还可以在某些情况下作为一种隐式类型转换机制。这种类型转换功能允许将其他类型的值自动转换为类对象。当类中有单参数的构造函数时,编译器可以在需要时自动使用该构造函数将非类对象的值转换为类对象。单参构造函数的类型转换功能4举例单参构造函数的类型转换功能classMoney{intyuan,jiao,fen;public:voidPrint(){cout<<yuan<<"元"<<jiao<<"角"<<fen<<"分\n";}Money(doubled){intt=d*100;yuan=t/100;jiao=(t-yuan*100)/10;fen=t%10;cout<<"Money("<<d<<")\n";

}Money(inty=0,intj=0,intf=0){yuan=y;jiao=j;fen=f;cout<<"Money("<<y<<","<<j<<","<<f<<")\n";

}};voidfun(Moneym){m.Print();}intmain(){fun(3);fun(4.57);return0;};单参构造函数带默认参数的构造函数实参到形参进行隐式类型转换Money(3,0,0)3元0角0分Money(4.57)4元5角7分内容导航单参构造函数的类型转换功能结构体简介大模型实践大模型探究结构体简介6结构体类型的定义结构体和类相似,是一种用户自定义的数据类型,它允许将不同类型的数据项组合成一个单一的类型。结构体常用于表示一组具有相关性的数据。structStudent{charname[50];intage;doublegpa;};类使用class关键字定义,结构体使用struct关键字定义结构体简介7结构体变量的定义与初始化创建变量(即结构体变量)。structStudents1;//C语言语法(C++中兼容),需要加上struct关键字Students1;//C++语法,可以直接使用Student定义变量创建变量

并初始化。structStudents2={"zhang",18,4.5};结构体简介8结构体变量的访问可以像类的成员一样访问结构体成员,使用点运算符(.)strcpy(,"zhang");s1.age=18;s1.gpa=4.5;cout<<"Name:"<<<<endl;cout<<"Age:"<<s1.age<<endl;cout<<"GPA:"<<s1.gpa<<endl;结构体简介9结构体与类的相同点:定义方式:两者都可以包含成员变量(属性)和成员函数(方法)。structMyStruct{inta;voidfunc(){/*...*/}};classMyClass{public:inta;voidfunc(){/*...*/}};结构体简介10结构体与类的相同点:访问控制:都可以指定成员变量的访问权限(public、protected、private)。struct的成员默认为public,而class的成员默认为private。structMyStruct{intx;//public};classMyClass{inty;//privatepublic:intz;//显式定义为public};结构体简介11结构体与类的相同点:继承:都可以继承其它类或结构体。classBaseClass{/*...*/};classDerivedClass:publicBaseClass{/*...*/};structBaseStruct{/*...*/};structDerivedStruct:BaseStruct{/*...*/};结构体简介后续章节学习12结构体与类的区别:默认访问权限结构体:成员默认为public。类:成员默认为private。用途与意图结构体:通常用于表示一组相关的数据(如坐标、日期等),数据通常与函数操作分离。类:不仅包含数据,还包含对这些数据的操作(成员函数),用于封装数据和操作,实现面向对象编程。结构体简介//使用类表示点,并包含操作classPointClass{public:intx,y;//计算距离到原点的函数doubledistanceToOrigin(){returnsqrt(x*x+y*y);}};//使用结构体表示点structPoint{intx,y;};13结构体在实际编程中的应用结构体常用于需要组织一组相关数据但不需要复杂行为的场景,例如:表示二维或三维空间中的点或向量。存储数据库记录的多个字段。传递函数参数时,打包多个数据项。结构体简介内容导航单参构造函数的类型转换功能结构体简介大模型实践大模型探究大模型实践15大模型实践实践案例-模拟动态圆形下落与木板接球系统

设想一个二维平面空间(如下图所示),其宽度和高度均为300单位。

在这个空间内,我们模拟一系列动态事件,涉及随机生成的圆形物体下落以及一个水平移动的木板。本程序仅模拟其中的运动与统计结果,不需要可视化演示运动过程。图12-6模拟空间16大模型实践实践案例-模拟动态圆形下落与木板接球系统具体规则如下:圆形物体生成:每个时间步于空间顶部(y=500)的随机位置生成一个圆形物体,每个圆的半径在[3,5]范围内随机选取,圆的下落速度在[1,3]范围内随机选取。所有随机值都为整数。圆形物体下落与碰撞:圆形物体以恒定速度向下运动,如果在下落过程中,两个圆发生了接触(即碰撞),则这两个圆都会立即消失。木板设置与运动:在空间底部中心位置放置一块长度为100单位(高度为0)的木板,木板以初始速度2向右水平移动。当木板碰到空间的左右边界时,其运动方向会发生反转,即从左向右变为从右向左,反之亦然。17大模型实践实践案例-模拟动态圆形下落与木板接球系统具体规则如下:木板接球判定:圆的底部边缘如果与木板发生接触,则认为该圆被木板接住,然后消失。如果圆的底部边缘与空间底部发生接触,则触地消失。统计在整个模拟过程中,有多少圆形物体被木板成功接住。下面演示通过向大模型提问的方式获得解决方案。18大模型实践实践案例-模拟动态圆形下落与木板接球系统【提问】:背景:学生在学习C++时,需要理解类与对象的相关概念。特色:你是一位经验丰富的计算机科学教师,专注于算法和数据结构的教学。技能:你具备深入的算法知识,能够清晰地解释复杂的算法概念。任务:[将上述案例描述内容复制到此]要求:1.从计算思维的角度,详细阐述解题思路,详细解释需要声明多少个类,每个类分别应该具有哪些数据成员和成员函数,它们的作用分别是什么?2.提供C++代码示例,演示如何实现。3.讨论实现时的注意事项和常见错误,特别是类的设计中易错知识点。19大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:解题思路:1.为了模拟这个二维平面空间中的动态事件,我们需要声明以下几个类:Circle类:表示圆形物体。Board类:表示水平移动的木板。Simulation类:管理整个模拟过程。(1)Circle类数据成员:intx,y;:圆的当前位置。intradius;:圆的半径。intspeed;:圆的下落速度。成员函数:Circle(intx,inty,intradius,intspeed):构造函数,初始化圆的属性。voidfall():更新圆的位置,使其下落。boolisColliding(constCircle&other):判断当前圆是否与另一个圆发生碰撞。boolisCaughtByBoard(constBoard&board):判断当前圆是否被木板接住。boolisTouchingGround(intgroundY):判断当前圆是否触地。20大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:(2)Board类数据成员:intx,y;:木板的当前位置。intlength;:木板的长度。intspeed;:木板的移动速度。intdirection;:木板的移动方向(1表示向右,-1表示向左)。成员函数:Board(intx,inty,intlength,intspeed):构造函数,初始化木板的属性。voidmove(intwidth):更新木板的位置,使其移动并处理碰到边界的情况。(3)Simulation类数据成员:intwidth,height;:模拟空间的宽度和高度。Boardboard;:木板对象。vector<Circle>circles;:存储所有圆形物体的容器。intcaughtCount;:记录被木板接住的圆的数量。成员函数:Simulation(intwidth,intheight):构造函数,初始化模拟空间和木板。voidgenerateCircle():生成一个新的圆形物体。voidupdate():更新所有圆形物体和木板的位置,并处理碰撞和接球判定。voidrun(intsteps):运行模拟,执行指定的时间步数。21大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:2.C++代码示例:#include<iostream>#include<vector>#include<cmath>//forsqrt#include<ctime>//fortimeusingnamespacestd;//木板类,表示水平移动的木板classBoard{public:intx,y,length,speed,direction;//构造函数,初始化木板的属性Board(intx,inty,intlength,intspeed){this->x=x;this->y=y;this->length=length;this->speed=speed;this->direction=1;}//移动木板,并处理碰到边界的情况voidmove(intwidth){x+=speed*direction;if(x+length/2>=width){direction=-1;x=width-length/2;}elseif(x<=0){22大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】: direction=1;x=0;}}};//圆形物体类,表示下落的圆形物体classCircle{public:intx,y,radius,speed;//构造函数,初始化圆的属性Circle(intx,inty,intradius,intspeed){this->x=x;this->y=y;this->radius=radius;this->speed=speed;}//更新圆的位置,使其下落voidfall(){y-=speed;}//判断当前圆是否与另一个圆发生碰撞boolisColliding(constCircle&other){intdx=x-other.x;intdy=y-other.y;doubledistance=sqrt(dx*dx+dy*dy);returndistance<(radius+other.radius);}23大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:boolisCaughtByBoard(constBoard&board)//判断当前圆是否被木板接住{returny-radius<=board.y&&x>=board.x&&x<=board.x+board.length;}boolisTouchingGround(intgroundY){returny-radius<=groundY;}//判断当前圆是否触地};classSimulation{//模拟类,管理整个模拟过程public:intwidth,height,caughtCount;Boardboard;

vector<Circle>circles;//构造函数,初始化模拟空间和木板Simulation(intwidth,intheight):board(width/2-50,0,100,2){this->width=width;this->height=height;this->caughtCount=0;srand(static_cast<unsignedint>(time(0)));}24大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】://生成一个新的圆形物体voidgenerateCircle(){intx=rand()%width;intradius=3+rand()%3;intspeed=1+rand()%3;circles.push_back(Circle(x,height,radius,speed));}25大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:voidupdate(){//更新所有圆形物体和木板的位置,并处理碰撞和接球判定board.move(width);for(size_ti=0;i<circles.size();){circles[i].fall();boolremoved=false;for(size_tj=0;j<circles.size();){//检查当前圆是否与其他圆发生碰撞if(i!=j&&circles[i].isColliding(circles[j])){//如果发生碰撞,删除这两个圆circles.erase(circles.begin()+i);if(j>i)j--;//因为删除了元素,j的下标需要减1circles.erase(circles.begin()+j);removed=true;break;}

else{j++;

}}26大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:voidupdate(){//更新所有圆形物体和木板的位置,并处理碰撞和接球判定board.move(width);for(size_ti=0;i<circles.size();){circles[i].fall();boolremoved=false;for(size_tj=0;j<circles.size();){//检查当前圆是否与其他圆发生碰撞if(i!=j&&circles[i].isColliding(circles[j])){//如果发生碰撞,删除这两个圆circles.erase(circles.begin()+i);if(j>i)j--;//因为删除了元素,j的下标需要减1circles.erase(circles.begin()+j);removed=true;break;}

else{j++;

}}27大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:if(removed)continue;//检查当前圆是否被木板接住if(circles[i].isCaughtByBoard(board)){caughtCount++;circles.erase(circles.begin()+i);}elseif(circles[i].isTouchingGround(0)){//检查当前圆是否触地circles.erase(circles.begin()+i);}

else{

i++;

}}}//运行模拟,执行指定的时间步数voidrun(intsteps){for(inti=0;i<steps;++i){generateCircle();update();}cout<<"Totalcirclescaughtbytheboard:"<<caughtCount<<endl;}};28大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:intmain(){//创建一个模拟对象,并运行模拟Simulationsim(300,300);//运行模拟,执行1000个时间步sim.run(1000);return0;}29大模型实践实践案例-模拟动态圆形下落与木板接球系统【回复】:3.实现时的注意事项和常见错误(1)初始化列表:在构造函数中使用初始化列表可以提高效率,某些情况下不使用初始化列表可能会导致性能下降或未定义行为。(2)内存管理:在本例中,我们使用vector来管理Circle对象的动态数组。需要注意的是,删除vector中的元素时,迭代器可能会失效,因此需要小心处理。(3)随机数生成:使用srand(time(0))初始化随机数种子,以确保每次运行程序时生成的随机数序列不同。(4)边界条件:在处理木板和圆形物体的运动时,需要注意边界条件,确保它们不会超出模拟空间的范围。(5)碰撞检测:在进行碰撞检测时,需要确保计算的准确性,避免浮点数精度问题导致的错误判断。通过以上的设计和实现,我们可以模拟二维平面空间中的圆形物体下落和木板接球的过程,并统计被木板成功接住的圆形物体数量。内容导航单参构造函数的类型转换功能结构体简介大模型实践大模型探究大模型探究31大模型探究探究1对象指针存储的是对象的内存地址,但是一个对象包含很多数据,占据多个字节,指针存储哪个地址?在C++中,对象指针存储的是对象在内存中的起始地址。具体来说,指针指向的是对象的第一个字节的地址。尽管一个对象可能包含多个数据成员,占据多个字节,但指针只需要存储对象的起始地址即可。详细解释如下:对象的内存布局:一个对象在内存中是连续存储的。对象的每个数据成员按照其声明的顺序依次存储在内存中。对象的起始地址是其第一个数据成员的地址。指针的存储:指针是一个变量,用于存储内存地址。在C++中,指针的大小通常是固定的(例如,在32位系统中为4字节,在64位系统中为8字节),与它指向的数据类型无关。当我们声明一个指向对象的指针时,这个指针存储的是对象的起始地址。【回复】:32大模型探究探究1对象指针存储的是对象的内存地址,但是一个对象包含很多数据,占据多个字节,指针存储哪个地址?以下是一个简单的示例,演示对象指针存储对象起始地址的概念:#include<iostream>usingnamespacestd;classMyClass{public:inta;

doubleb;charc;MyClass(intx,doubley,charz):a(x),b(y),c(z){}};【回复】:intmain(){MyClassobj(1,2.5,'A');MyClass*ptr=&obj;cout<<"Addressofobj:"<<&obj<<endl;cout<<"Addressstoredinptr:"<<ptr<<endl;cout<<"Addressofobj.a:"<<&(obj.a)<<endl;cout<<"Addressofobj.b:"<<&(obj.b)<<endl;cout<<"Addressofobj.c:"<<&(obj.c)<<endl;return0;}33大模型探究探究1对象指针存储的是对象的内存地址,但是一个对象包含很多数据,占据多个字节,指针存储哪个地址?输出结果:Addressofobj:0x7ffee4b3c8a0Addressstoredinptr:0x7ffee4b3c8a0Addressofobj.a:0x7ffee4b3c8a0Addressofobj.b:0x7ffee4b3c8a4Addressofobj.c:0x7ffee4b3c8ac输出解释:Addressofobj和Addressstoredinptr显示的是对象obj的起始地址。Addressofobj.a显示的是对象的第一个数据成员a的地址,它与对象的起始地址相同。Addressofobj.b和Addressofobj.c显示的是对象的其它数据成员的地址,它们相对于对象的起始地址有一定的偏移。总结:对象指针存储的是对象的起始地址,即对象在内存中的第一个字节的地址。通过这个地址,程序可以访问对象的所有数据成员。【回复】:34大模型探究探究2对于Car类的构造函数,为了给成员赋初始值,有以下两种方式:使用赋值语句赋值:Car(stringb,inty){brand=b;year=y;}使用初始化列表:Car(stringb,inty):brand(b),year(y){}这两种方式都是给数据成员赋值,它们有什么区别吗?在C++中,给类的成员变量赋初始值有两种常见方式:使用赋值语句和使用初始化列表。虽然这两种方式都能实现成员变量的初始化,但它们在底层实现和性能上有一些重要的区别。1.使用赋值语句赋值工作原理:在构造函数体内,成员变量首先被默认构造,然后再通过赋值语句进行赋值。这意味着成员变量会经历两次操作:一次默认构造,一次赋值。示例代码中:brand先调用string类的默认构造函数,然后再通过赋值语句brand=b进行赋值。year先被默认初始化(对于基本数据类型,默认初始化可能是未定义的),然后再通过赋值语句year=y进行赋值。【回复】:35大模型探究探究2对于Car类的构造函数,为了给成员赋初始值,有以下两种方式:使用赋值语句赋值:Car(stringb,inty){brand=b;year=y;}使用初始化列表:Car(stringb,inty):brand(b),year(y){}这两种方式都是给数据成员赋值,它们有什么区别吗?2.使用初始化列表工作原理:初始化列表在构造函数体执行之前对成员变量进行初始化。成员变量直接通过初始化列表进行初始化,而

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论