摘要:本篇文章主要讲述C/C++知识点之函数重载,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。
本篇文章主要讲述C/C++知识点之函数重载,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。
1,本课程最初阶段就学习了函数重载,但是那时研究目标仅限于全局函数,到目前 为止我们学习了三种函数:
1,全局函数;
2,普通成员函数;
3,静态成员函数;
这三种不同类型的函数之间是否可以构成重载,这是本文讨论的主要内容;
2,函数重载回顾:
1,函数重载的本质为相互独立的不同函数;
2,C++ 中通过函数名和函数参数确定参数调用;
3,无法直接通过函数名得到重载函数的入口地址;
1,如果函数被重载,还需要函数的参数信息;
4,函数重载必然发生在同一个作用域中;
3,类中的重载:
1,类中的成员函数可以进行重载:
1,构造函数的重载;
2,普通成员函数的重载;
3,静态成员函数的重载;
2,全局函数、普通成员函数以及静态成员函数之间是否可以构成重载?
4,万变不离其宗:
1,重载函数本质为多个不同的函数;
1,上述三种函数本质不同;
2,函数名和参数列表是唯一的标识;
1,普通成员函数和静态成员函数之间可以构成重载;
3,函数重载必须发生在同一个作用域中;
1,普通成员函数和静态成员函数在同一个作用域(不区分内存类别)中;
2,类的成员函数和全局函数不能构成重载,不在同一个作用域中;
5,类与重载全面分析实例分析:
1,main.cpp 文件:
1 #include <stdio.h>
2
3 class Test
4 {
5 int i;
6 public:
7 Test()
8 {
9 printf("Test::Test()\n");
10 this->i = 0;
11 }
12
13 Test(int i)
14 {
15 printf("Test::Test(int i)\n");
16 this->i = i;
17 }
18
19 Test(const Test& obj) // 三个构造函数之间也构成了重载,这是拷贝构造函数;
20 {
21 printf("Test(const Test& obj)\n");
22 this->i = obj.i;
23 }
24
25 static void func()
26 {
27 printf("void Test::func()\n");
28 }
29
30 void func(int i) // 和上面的静态成员函数构成重载;
31 {
32 printf("void Test::func(int i), i = %d\n", i);
33 }
34
35 int getI()
36 {
37 return i;
38 }
39 };
40
41 void func()
42 {
43 printf("void func()\n");
44 }
45
46 void func(int i)
47 {
48 printf("void func(int i), i = %d\n", i);
49 }
50 51 int main() 52 { 53 func(); 54 func(1); 55 56 Test t; // Test::Test(); 57 Test t1(1); // Test::Test(int i); 58 Test t2(t1); // Test(const Test& obj); 59 60 func(); // void func(); 61 Test::func(); // void Test::func(); 62 63 func(2); // void func(int i), i = 2; 64 t1.func(2); // void Test::func(int i), i = 2; 65 t1.func(); // void Test::func(); 66 67 return 0; 68 }
2,输出结果:
1 void func() 2 void func(int i), i = 1 3 Test::Test() 4 Test::Test(int i) 5 Test(const Test& obj) 6 void func() 7 void Test::func() 8 void func(int i), i = 2 9 void Test::func(int i), i = 2 10 void Test::func()
6,重载的深度意义:
1,通过函数名对函数功能进行提示;
1,最大的好处;
2,通过参数列表对函数用法进行提示;
1,真正的意义;
2,代码自注释;
3,扩展系统中已经存在的函数功能;
1,更高层次的看待函数重载,虽然实质是增加了新的函数;
7,重载的意义分析编程实验:
1,main.cpp 文件:
1 #include <stdio.h> 2 #include <string.h> 3 4 /* 扩展 strcpy() 函数的功能 */ 5 char* strcpy(char* buf, const char* str, unsigned int n) 6 { 7 return strncpy(buf, str, n); 8 } 9 10 int main() 11 { 12 const char* s = "D.T.Software"; 13 char buf[8] = {0}; 14 15 // strcpy(buf, s); // 这里会造成内存越界; 16 // strncpy(buf, s, sizeof(buf) - 1); // 最多拷贝 n 个字符,这里 C 语言中的解决方案不好,增加了新的函数,但是名字让人费解; 17 strcpy(buf, s, sizeof(buf)-1); 18 19 printf("%s\n", buf); 20 21 return 0; 22 }
2,输出结果:
D.T.Soft
3,重载函数 strcpy(buf, str, n) 的意义:
1,通过函数重载扩展了已有的 strcpy(buf, str) 功能,使得它从原来的两个参数的状态变成了三个参数,安全性提高了,但是对于开发者而言调用的是同一个函数,并且容易记忆;
8,重载能够扩展系统中已经存在的函数功能,重载是否也能够扩展其他更多的功能?
1,可以,操作符重载;
9,下面复数解决方案是否可行?
1,代码示例:
1 class Comples 2 { 3 public: 4 int a; 5 int b; 6 }; 7 8 int main() 9 { 10 Complex c 1 = {1, 2}; 11 Complex c2 = {3, 4}; 12 Complex c3 = c1 + c2; 13 14 return 0; 15 }
2,通过重载扩展 “+” 的功能,使得它能够对非实数的复数进行加减;
10,小结:
1,类的成员函数之间可以进行重载;
2,重载必须发生在同一个作用域中;
3,全局函数和成员函数不能构成重载关系;
4,重载的意义在于扩展已经存在的功能;
本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号