作业
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> 函数重载的要求:
- 函数名相同
- 形参列表必须不同:可以是参数个数不同、参数类型不同
- 作用域也要相同
- 跟返回值没有关系
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> 有参宏和内联函数的区别
- 本质的区别:有参宏是宏替换,内联函数是函数调用
- 替换时机:有参宏替换发生在预处理阶段,内联函数替换发生在编译阶段
四、C++对结构体的扩充
1> C语言中的结构体,仅仅只是属性(变量)的聚合体,不允许在结构体中定义函数,如果想要定义函数,需要使用函数指针,完成函数回调
2> C++中的结构体内可以包罗万象,既可以封装属性、也可以封装函数、还可以封装一个结构体
3> C++中的结构体在定义属性时,可以直接给定初始值,而C语言中不行
4> C++中的结构体在定义结构体变量时,可以不用加关键字struct,而C语言中不可以
5> C++中的结构体可以有访问权限控制,C语言中的结构体没有访问权限控制
6> C++中的结构体可以被继承,C语言中的结构体不可以