当前位置: 首页 > news >正文

2023/9/7 -- C++/QT

作业

1> 思维导图

2> 封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数,

提供一个公有成员函数,void setNum(int num)用于设置学生个数

提供一个公有成员函数:void input(),用来对所有学生的成绩进行输入工作

提供一个公有成员函数:void sort(),用来实现对存储的学生成绩进行降序排序

提供一个公有的成员函数:void show(),用于将所有学生的成绩展示出来

在主程序中,完成相关函数的调用

#include <iostream>using namespace std;struct Stu{
private:int score_array[1024];int count;
public:void setNum(int num){count = num;}void input(){int score;for(int i = 0;i < count;i++){cout<<"请输入学生成绩:";cin>>score;score_array[i] = score;}}void sort(){int temp;for(int i = 0;i < count-1;i++){for(int j = 0;j < count-1-i;j++){if(score_array[j]<score_array[j+1]){temp = score_array[j];score_array[j] = score_array[j+1];score_array[j+1] = temp;}}}cout<<"排序成功"<<endl;}void show(){for(int i = 0;i < count;i++){cout<<score_array[i]<<' ';}cout<<endl;}
};int main()
{Stu s1;s1.setNum(8);s1.input();s1.show();s1.sort();s1.show();return 0;
}

效果图: 

一、引用 

1.1 &的用途

1、&后面跟变量名,表明取得该变量的地址

2、作为双目运算符,一个&表示按位与运算

3、作为双目运算符,两个&&表示逻辑与运算

4、定义引用时, 表明身份的象征,一个&表明是左值引用,两个&&表明是右值引用

5、对于一个&使用时,如果左侧有数据类型,表明正在定义引用,如果左侧没有数据类型,表明是取地址运算符

1.2 指针与引用的区别

1> 指针记录的是变量的地址,而引用变量本身

2> 定义引用时必须初始化,而定义指针不是必须初始化

3> 指针需要分配8字节的内存空间,而引用与目标是同一内存空间,无需额外分配

4> 指针可以有多级指针,但是引用只有一级引用

5> 指针后期可以更改指向,而引用一旦绑定后期就不能进行更改目标了

6> const修饰指针时,有修饰指向和值,而const修饰引用时,只有修饰值

7> 指针使用时,需要使用取值运算符进行解引用,而引用使用时跟目标的使用方式一致

8> 没有引用数组,但是有数组引用

二、C++中的动态内存分配和回收

2.1 new\delete与malloc\free的区别

1> new申请空间时,可以给堆区空间进行初始化,而malloc申请时不能进行初始化

2> new\delete是关键字,而malloc\free是库函数

3> new申请空间时以数据类型为单位,而malloc申请空间时以字节为单位

4> new申请的空间返回的结果申请类型的指针,而malloc申请空间时返回void*类型,需要进行强转后使用

5> new申请空间时会调用构造函数,malloc不会(后期讲)

6> delete释放空间时,会调用析构函数,free不会(后期讲)

三、C++对C的函数部分的扩充

3.1 函数重载

1> 在C语言中,同一作用域下不允许定义多个同名的函数,对于功能类似,但是只有数据类型不同的函数,也要定义多个不同名的函数,调用起来比较麻烦

2> C++中支持函数重载,即:在同一作用域下,可以定义多个同名的函数,但是要求参数列表必须不同

3> 所谓函数重载,是静态多态的一种,能够做到“一名多用”

4> 函数重载的要求:

  1. 函数名相同
  2. 形参列表必须不同:可以是参数个数不同、参数类型不同
  3. 作用域也要相同
  4. 跟返回值没有关系

5> 调用:当调用函数时,系统会根据传递的实参类型,自动匹配相应的重载函数

3.2 函数默认参数

1> C语言中定义函数时,不允许设置默认参数,函数形参的值,必须全部由实参进行传递后使用,实参的个数必须跟形参个数保持一致

2> C++定义函数时,允许给定默认参数,即:如果该参数有实参进行传递,则使用实参传递进来的值进行使用,如果实参没有对该参数进行传递,则使用默认参数

3> 默认参数的数组原则:靠右原则,只有右侧的形形参设置了默认参数后,左侧的形参才能设置默认参数,否则报错,原因是,函数实参向形参传递时是靠左原则

4> 当函数默认参数跟函数重载同时出现时,可以定义重载参数个数小于带默认参数的函数,但是,调用时会出现混乱情况

5> 当主调函数写在被调函数定义之前时,需要对对被调函数进行函数声明,函数的默认参数,写在函数声明部分,函数定义部分就不需要加默认参数了

3.3 哑元

1> 在C++中的函数中,允许将函数参数设置成哑元,即某个形参只有类型名,没有形参名,在函数体内也不使用该形参

2> 作用:哑元参数只起到占位作用,没有实质性的用途

3> 使用场景

1、在进行程序代码优化时,可能某个函数的某几个参数被优化掉了,但是,该函数已经在程序中调用多次,那么,此时就可以将这些参数设置成哑元,只起到占位作用,函数体内无需使用

2、在运算符重载时,进行区分自增自减运算符的前置和后置时,必须使用哑元完成(后期讲)

3.4 内联函数(inline)

1> C++中,允许定义内联函数,内联函数会建议编译器在编译程序的时候,将内联函数在调用处进行展开,运行时直接执行函数体内容,提供函数调用效率

2> 使用要求:要求函数体调用频繁,并且函数体内容较小,递归函数不允许定义成内联函数

3> 内联函数定义格式:在定义函数前加关键字inline即可

4> 有参宏和内联函数的区别

  1. 本质的区别:有参宏是宏替换,内联函数是函数调用
  2. 替换时机:有参宏替换发生在预处理阶段,内联函数替换发生在编译阶段

四、C++对结构体的扩充

1> C语言中的结构体,仅仅只是属性(变量)的聚合体,不允许在结构体中定义函数,如果想要定义函数,需要使用函数指针,完成函数回调

2> C++中的结构体内可以包罗万象,既可以封装属性、也可以封装函数、还可以封装一个结构体

3> C++中的结构体在定义属性时,可以直接给定初始值,而C语言中不行

4> C++中的结构体在定义结构体变量时,可以不用加关键字struct,而C语言中不可以

5> C++中的结构体可以有访问权限控制,C语言中的结构体没有访问权限控制

6> C++中的结构体可以被继承,C语言中的结构体不可以

http://www.lryc.cn/news/166034.html

相关文章:

  • 2023年09月IDE流行度最新排名
  • MyBatis基础之概念简介
  • 解决 SQLyog 连接 MySQL8.0+ 报错:错误号码2058
  • Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)
  • mysql的date_format()函数格式月份的坑
  • 保姆级式教程:教你制作电子画册
  • 探究Nginx应用场景
  • sklearn中的数据集使用
  • LLM在电商推荐系统的探索与实践
  • Linux 文本操作指令
  • GIS地图服务数据可视化
  • java 获取实体类的反射 Field用法(获取对象的字段名和属性值) 包含注解值 - 如何用枚举类映射获取数据库字段名
  • 日志平台搭建第六章:logstash通过kafka通道采集日志信息
  • mysql的索引分类
  • 【校招VIP】java语言考点之并发相关
  • nginx实现路由重定向功能 避免服务器出现 404 Not Found
  • Flask+pyecharts+SQLAlchemy,统计图的数据存放在mysql中,综合版
  • SQL注入类型判断
  • ElasticSearch的安装部署-----图文介绍
  • Unity粒子系统ParticleSystem各模块及其参数学习
  • vue3实现卡片翻牌
  • 算法训练营day45|动态规划 part07:完全背包 (LeetCode 70. 爬楼梯(进阶)、322. 零钱兑换、279.完全平方数)
  • 【大模型】更强的开源可商用的中英文大语言模型baichuan2来了,从零开始搭建
  • ElasticSearch系列-简介与安装详解
  • Layui + Flask | 表单组件(组件篇)(07)
  • 【实践篇】Redis最强Java客户端Redisson
  • esxi扩容磁盘
  • 核心实验21_BGP高级(了解)(配置略)_ENSP
  • 宝塔安装python和openssl
  • TDengine 3.1.1.0 来啦!更新如下