C到C++过渡
- 函数提高
- 函数重载
- 函数模板
- 有默认参数的函数
- 结构体与类
- 结构体
- 类对象
- 封装
函数提高
函数重载
C++允许用同一函数名定义多个函数, 而这些函数的参数个数和参数类型可以不相同。这就是函数重载。即对一个函数名重新赋予它新的含义使一个函数名可以多用。所谓重载,其实就是“一物多用”。
函数重载条件
- 函数名相同
- 函数参数类型 或者 参数个数 或者 参数顺序三者中至少有一种不同(核心条件)
- 同一个作用域下
例:
int max(int a, int b);
double max(double a, double b);
int max(int a, int b, int c);int main()
{int a=4, b=5, c=3;double d1=1.2, d2=3.3;cout << "max=" << max(a,c) << endl;cout << "max=" << max(a,b,c) <<endl;cout << "max=" << max(d1,d2) << endl;return 0;}int max(int a, int b)
{return a>b?a:b;
}
double max(double a, double b)
{return a>b?a:b;
}
int max(int a, int b, int c)
{int max;max = a>b?a:b;max = max>c?max:c;return max;
}
系统会根据调用函数时给出的信息去找与之匹配的函数,上面的main函数3次调用max函数而每次实参的类型或个数不同,系统就根据实参的类型找到与之匹配的函数然后调用该函数。
在使用重载函数时, 同名函数的功能应当相同或相近, 不要用同一函数名去实现完全不相干的功能(如求最大值和求三角形面积), 虽然程序也能运行,但可读性不好易使人莫名其妙。重载的方法是很有用的, 后面还会有运算符的重载。
但能否对函数实现体进行简化呢。
函数模板
C++提供了函数模板,所谓函数模板, 实际上是建立一个通用函数其函数类型和形参类型不具体指定, 用一个虚拟的类型来代表这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替不必定义多个函数,只需要定义一个模板即可。
例如定义以下模板用于求最大值:
template <typename T> //模板声明,其中T为类型参数
T max(T a, T b, T c) //定义一个通用函数,用T作虚拟的类型名
{T max;max = a>b? a : b;max = max>c? max : c;return max;
}
实际调用
#include<iostream>
using namespace std;template <typename T> //模板声明,其中T为类型参数
T max(T a, T b, T c)
{T max;max = a>b? a : b;max = max>c? max : c;return max;
}int main()
{int a=4, b=5, c=3;double d1=1.2, d2=3.3;cout << "max=" << max(a,b,c) <<endl;cout << "max=" << max(d1,d2) << endl;return 0;
}
可以看到,用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数体相同函数的参数个数相同而类型不同的情况,如果参数的个数不同,则不能用函数模板。
当然类型参数可以不止一个, 可以根据需要自行灵活确定个数,如:
template<typename T>
void printArray(T arr[], int len) {for (int i = 0; i < len; i++) {cout << arr[i] << " ";
}cout << endl;
}
有默认参数的函数
在C++中,函数的形参列表中的形参是可以有默认值的,但指定默认值的参数必须放在形参表列中的最右端,否则出错。
语法:
返回值类型 函数名 (参数= 默认值){ }
注意点:
- 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
- 如果函数声明有默认值,函数实现的时候就不能有默认参数
- 一个函数不能既作为重载函数, 又作为有默认参数的函数
例:
#include<iostream>
using namespace std;int max(int a, int b, int c=0);int main()
{int a=3, b=4, c=5;cout << "max=" << max(a,b) << endl;cout << "max=" << max(a,b,c) <<endl;return 0;
}int max(int a, int b, int c)
{int max;max = a>b? a : b;max = max>c? max : c;return max;
}
结构体与类
结构体
- 在前期对学生成绩统计,需要根据学生的姓名或ID进行查找,并对学生的信息按成绩进行排序,以及链表的学习中,我们早已接触过结构体,即将学生的一些信息封装到一种特殊的数据类型中进行保存,当然在结构体也可以有函数指针,指向实现一定功能的函数,具体的结构体内容可回顾:结构体整理
以下给出结构体的基本定义进行回顾:struct Student //自定义类型 {int score; //分数 char name[128]; //名字 };
类对象
- 而在面向对象开发过程中,总认为一切事物皆对象(结构体),有各自的信息和一些函数。
C++认为万事万物都皆为对象,任何一个对象都应当具有两个要素,即属性和方法
例如: - 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌…
- 车也可以作为对象,属性有轮胎、方向盘、车灯…, 行为有载人、放音乐、放空调…
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类
封装
封装的意义
- 将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相互独立,互不干扰
- 将对象中的某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外部连接,接收外部消息
类的声明与定义:class Student { public://定义一个成员函数 void display(){cout <<"num:" << num << endl;cout <<"name:" << name << endl;cout <<"sex:" << sex << endl; } private:// 声明三个成员变量 int num;char name[20];char sex; };