1 // C++函数和类 10-函数重载.cpp: 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <array> 7 #include <math.h> 8 #include <climits> 9 #include <string> 10 using namespace std; 11 //如果同一个作用域内的几个函数名字相同但形参列表不同, 12 //我们称之为重载函数。 13 //void print(const char*cp); 14 //void print(const int *beg, const int *end); 15 //void print(const int ia[], size_t size); 16 //这些函数接收的形类型不一样,但是执行的操作非常类似。当调用这些函数时,编译器和根据 17 //传递的实参类型推断想要的是哪个函数。 18 19 20 //重载函数,名称相同但是参数列表不同的函数,调用时,系统会根据传递的实参来选择调用的函数。 21 void print(const char *cp); 22 void print(const int *beg, const int *end); 23 void print(const int ia[], size_t size); 24 int sum_arr(const int arr[], int n); 25 26 void fill_arr(int arr[], int n); 27 void ratio(int arr[], int n, int sum); 28 void print_arr(const int arr[], int n); 29 int main() 30 { 31 char c = 'a'; 32 //传递的实参是char类型的指针,所以会调用第一个函数。 33 print(&c); 34 35 const size_t size =5; 36 int arr[size] = { 2,3,3 }; 37 //传递的实参是两个int类型的指针,所以会调用第二个函数。 38 print(&arr[2], &arr[size - 1]); 39 //传递的实参是数组名和一个size_t类型的值,所以会调用第三个函数。 40 print(arr, size); 41 42 //print(arr); //传递的实参是数组名,但是没有和它相对应的参数列表的函数,所以会出错。 43 44 const int size2 = 6; 45 int student1[size2] = { 120,110,100,90,85,95 }; 46 int totalScore = sum_arr(student1, size2); 47 cout << "该名学生的总成绩为:" << totalScore << endl; 48 49 int student2[size2] = {}; 50 fill_arr(student2, size2); 51 totalScore = sum_arr(student2, size2); 52 cout << "该学生的各科成绩为:"; 53 print_arr(student2, size2); 54 ratio(student2,size2,totalScore); 55 cout << "各科成绩所占百分比(%): " << endl; 56 print_arr(student2, size2); 57 58 return 0; 59 } 60 61 void print(const char *cp) 62 { 63 cout<<"1:"<< *cp << endl; 64 } 65 66 void print(const int *beg, const int *end) 67 { 68 int length = end - beg; 69 for (int i = 0; i <= length; i++) 70 { 71 cout << "2:" << *(beg + i) << endl; 72 } 73 } 74 75 void print(const int ia[], size_t size) 76 { 77 for (int i = 0; i < size; i++) 78 { 79 cout << "3:" << ia[i] << endl; 80 } 81 } 82 83 //arr 是一个指针,指向数组的第一个元素,const int类型,所以不能修改数组内的值。 84 //n是数组的大小 85 //在函数体内,可以将arr直接当做数组名使用,*arr和arr[]的意义相同。 86 int sum_arr(const int arr[], int n) //这么写是为了避免出错在写代码时在某个地方修改了数组的值。求和运算时不需要修改数组内的值的。 87 { 88 int res = 0; 89 for (int i = 0; i < n; i++) 90 { 91 res += arr[i]; 92 } 93 return res; 94 } 95 96 //填充数组或修改数组:由于接收数组名参数的函数访问的是原始数组(使用指针访问),而不是副本, 97 //因此可以通过调用改函数将值赋给数组元素,或是修改数组元素的值。 98 //显示数组以及保护数组:为了确保显示函数不修改原始数组,可以在声明形参是使用关键字const。 99 //二维数组:int sum (int ar2[][4],int size); 100 101 void fill_arr(int arr[], int n) 102 { 103 cout << "请输入该学生的成绩(语数外物化生):" << endl; 104 int temp; 105 for (int i = 0; i < n; i++) 106 { 107 cin >> temp; 108 arr[i] = temp; 109 } 110 } 111 void ratio(int arr[], int n, int sum) 112 { 113 for (int i = 0; i < n; i++) 114 { 115 arr[i] = arr[i] * 100 / sum; 116 } 117 } 118 void print_arr(const int arr[], int n) 119 { 120 121 for (int i = 0; i < n; i++) 122 { 123 cout << arr[i] << " "; 124 } 125 cout << endl; 126 }