面向对象程序设计:C++中的数组与指针

需积分: 0 0 下载量 54 浏览量 更新于2024-08-19 收藏 1.21MB PPT 举报
"数组名做参数-OPP2010之C++课件" 这篇课件主要探讨了C++中的数组名作为函数参数的特性,同时也涵盖了面向对象编程的基础知识和C/C++语言的特点。在C++中,当数组名作为参数传递时,实际上它并不是传递整个数组,而是传递数组的首地址,即一个指向数组首元素的指针。这意味着在函数内部对数组的修改会影响到函数外部的数组,因为它们共享同一块内存空间,没有新开辟额外的存储空间。 例如,在给出的代码段中,`Main()`函数创建了一个名为`a`的整型数组,并将其传递给`read()`函数。在`read()`函数内部,通过`for`循环读取用户输入的数据并存储到数组中。由于数组名`a`在传递过程中相当于传入了数组首地址,因此`read()`函数内部的`a[i]`实际上是访问了`Main()`函数中的数组元素。 课件还提到了C++与C语言的特点。C++是为了支持面向对象编程而扩展了C语言,增加了类、对象、封装、继承、多态等概念。C++保留了C语言的灵活性,但语法相对不那么规则。同时,C++引入了新的数据类型和语法来服务于面向对象编程,但它与C#、Java相比,被认为在面向对象特性上稍显不纯粹。C++支持面向过程和面向对象的编程风格,并且这两种方式将在很长一段时间内共存。 课程内容包括C语言的简要回顾,如数组、指针的基本操作。在指针部分,课件讨论了数组名与指针的关系,以及`[]`运算符与`*`运算符的用法和比较,强调了越界访问的风险。数组名作为参数的例子展示了如何通过指针在函数间共享和修改数组数据。 此外,课件还涉及了面向对象编程的重要概念,如类的定义、对象的实例化、抽象、继承、组合等,这些都是理解C++和现代软件开发的关键。面向对象设计方法的出现主要是因为传统过程式语言在复杂软件设计上的局限性,它的核心优势在于代码的复用性和模块化。 课程还讨论了与其他课程的关系,就业面试准备,以及考试重点。面向对象编程不仅关乎技术,还与软件工程的实践紧密相连,是求职者必须掌握的一项技能。同时,课程提醒学生关注C++语言中的C特性,这对于理解和编写混合了面向过程和面向对象风格的代码至关重要。

#include "def.h" #include "utils/maths.h" //用户注意;接口需要如下声明 extern "C"_declspec(dllexport) PlayerTask player_plan(const WorldModel* model, int robot_id); enum ball_near //PenaltyArea { outOfOrbit, onOrbit, shoot }; PlayerTask player_plan(const WorldModel* model, int robot_id){ PlayerTask task; const point2f& opp_goal = model->get_place_pos(); const float pi = 3.1415926; const float& circleR = 30; const float& DetAngle = 0.6; const point2f& goal = FieldPoint::Goal_Center_Point; const point2f& ball = model->get_ball_pos(); const point2f& kicker = model->get_our_player_pos(robot_id); const float& dir = model->get_our_player_dir(robot_id); ball_near orbit; point2f shootPosOnOrbit = ball + Maths::vector2polar(circleR, (ball - opp_goal).angle()); float toShootDir = fabs((kicker - ball).angle() - (ball - opp_goal).angle()); //(kicker - shootPosOnOrbit).length(); float toBallDist = (kicker - ball).length(); float toOppGoalDir = (opp_goal - kicker).angle(); float toBallDir = (ball - kicker).angle(); point2f robotBallAcrossCirclePoint = ball + Maths::vector2polar(circleR, (kicker - ball).angle()); point2f AntishootPosOnOrbit = ball + Maths::vector2polar(circleR, (opp_goal - ball).angle()); point2f BallToRobot = kicker - ball; if (toBallDist >circleR + 10) orbit = outOfOrbit; else if (toShootDir > 1) orbit = onOrbit; else orbit = shoot; bool getBall = toBallDist < 10; float diffdir_onorbit = 0; float b2r = BallToRobot.angle(); float o2b = (ball - opp_goal).angle(); bool add; switch (orbit) { case outOfOrbit: task.target_pos = robotBallAcrossCirclePoint; task.orientate = toOppGoalDir; break; case onOrbit: if (b2r * o2b >0){ if (b2r > 0){ if (b2r > o2b) add = false; else add = true; } else{ if (b2r > o2b) add = false; else add = true; } } else{ if (b2r > 0) add = true; else add = false; } if (add) { //+ task.target_pos = ball + Maths::vector2polar(circleR, BallToRobot.angle() + DetAngle); task.orientate = toOppGoalDir; } else { //- task.target_pos = ball + Maths::vector2polar(circleR, BallToRobot.angle() - DetAngle); task.orientate = toOppGoalDir; } break; case shoot: task.target_pos = ball + Maths::vector2polar(5, (ball - opp_goal).angle()); task.orientate = toOppGoalDir; task.needKick = true; task.flag = 1; if (toBallDist < 10 && fabs(model->get_our_player_dir(robot_id) - task.orientate) < 0.15){ task.kickPower = 60; } break;

2023-07-12 上传