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 }