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


    作业

    1> 思维导图

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

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

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

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

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

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

    1. #include
    2. using namespace std;
    3. struct Stu{
    4. private:
    5. int score_array[1024];
    6. int count;
    7. public:
    8. void setNum(int num){
    9. count = num;
    10. }
    11. void input(){
    12. int score;
    13. for(int i = 0;i < count;i++){
    14. cout<<"请输入学生成绩:";
    15. cin>>score;
    16. score_array[i] = score;
    17. }
    18. }
    19. void sort(){
    20. int temp;
    21. for(int i = 0;i < count-1;i++){
    22. for(int j = 0;j < count-1-i;j++){
    23. if(score_array[j]1]){
    24. temp = score_array[j];
    25. score_array[j] = score_array[j+1];
    26. score_array[j+1] = temp;
    27. }
    28. }
    29. }
    30. cout<<"排序成功"<
    31. }
    32. void show(){
    33. for(int i = 0;i < count;i++){
    34. cout<' ';
    35. }
    36. cout<
    37. }
    38. };
    39. int main()
    40. {
    41. Stu s1;
    42. s1.setNum(8);
    43. s1.input();
    44. s1.show();
    45. s1.sort();
    46. s1.show();
    47. return 0;
    48. }

    效果图: 

    一、引用 

    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语言中的结构体不可以

  • 相关阅读:
    学长教你学C-day4-C语言字符串的输入与输出函数
    3、TCP状态
    千兆工业交换机和百兆以太网交换机有什么区别?
    如何快速将txt类型的日志文件转换为excel表格并进行数据分析报表统计图(如:饼图、折线图、柱状图)?
    【Linux指令】Centos7 touch修改Access/Modify/Change 时间与恢复系统时间
    MySQL text 能存多少个字符
    docker安装rocketMQ并测试
    计算机网络第三章——数据链路层(二)
    JS-Number数字类型详解
    item_get-商品详情
  • 原文地址:https://blog.csdn.net/weixin_54147737/article/details/132744134