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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Command line: -prefix /home/liuyh/workspace/qt5.14.2-arm -opensource -confirm-license -release -strip -shared -xplatform linux-arm-gnueabi-g++ -optimized-qmake -c++std c++11 --rpath=no -pch -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtwayland -skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -make libs -make examples -nomake tools -nomake tests -gui -widgets -dbus-runtime --glib=no --iconv=no --pcre=qt --zlib=qt -no-openssl --freetype=qt --harfbuzz=qt -no-opengl -linuxfb --xcb=no -tslib --libpng=qt --libjpeg=qt --sqlite=qt -plugin-sql-sqlite -I/opt/tslib/include -L/opt/tslib/lib -recheck-all executing config test machineTuple + arm-linux-gnueabi-g++ -dumpmachine > sh: 1: arm-linux-gnueabi-g++: not found test config.qtbase.tests.machineTuple FAILED executing config test verifyspec + cd /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/config.tests/verifyspec && /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/bin/qmake "CONFIG -= qt debug_and_release app_bundle lib_bundle" "CONFIG += shared warn_off console single_arch" 'QMAKE_LIBDIR += /opt/tslib/lib' 'INCLUDEPATH += /opt/tslib/include' -early "CONFIG += cross_compile" /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec + cd /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/config.tests/verifyspec && MAKEFLAGS= /usr/bin/make clean && MAKEFLAGS= /usr/bin/make > rm -f verifyspec.o > rm -f *~ core *.core > arm-linux-gnueabi-g++ -c -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -pipe -O2 -w -fPIC -I/home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec -I. -I/opt/tslib/include -I/home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-arm-gnueabi-g++ -o verifyspec.o /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec/verifyspec.cpp > make:arm-linux-gnueabi-g++:命令未找到 > make: *** [Makefile:172:verifyspec.o] 错误 127
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值