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 文件:

 #include <stdio.h>

 class Test
{
int i;
public:
Test()
{
printf("Test::Test()\n");
this->i = ;
} Test(int i)
{
printf("Test::Test(int i)\n");
this->i = i;
} Test(const Test& obj) // 三个构造函数之间也构成了重载,这是拷贝构造函数;
{
printf("Test(const Test& obj)\n");
this->i = obj.i;
} static void func()
{
printf("void Test::func()\n");
} void func(int i) // 和上面的静态成员函数构成重载;
{
printf("void Test::func(int i), i = %d\n", i);
} int getI()
{
return i;
}
}; void func()
{
printf("void func()\n");
} void func(int i)
{
printf("void func(int i), i = %d\n", i);
} int main()
{
func();
func(); Test t; // Test::Test();
Test t1(); // Test::Test(int i);
Test t2(t1); // Test(const Test& obj); func(); // void func();
Test::func(); // void Test::func(); func(); // void func(int i), i = 2;
t1.func(); // void Test::func(int i), i = 2;
t1.func(); // void Test::func(); return ;
}

2,输出结果:

 void func()
void func(int i), i =
Test::Test()
Test::Test(int i)
Test(const Test& obj)
void func()
void Test::func()
void func(int i), i =
void Test::func(int i), i =
void Test::func()

6,重载的深度意义:

1,通过函数名对函数功能进行提示;

1,最大的好处;

2,通过参数列表对函数用法进行提示;

1,真正的意义;

2,代码自注释;

3,扩展系统中已经存在的函数功能;

1,更高层次的看待函数重载,虽然实质是增加了新的函数;

7,重载的意义分析编程实验:

1,main.cpp 文件:

 #include <stdio.h>
#include <string.h> /* 扩展 strcpy() 函数的功能 */
char* strcpy(char* buf, const char* str, unsigned int n)
{
return strncpy(buf, str, n);
} int main()
{
const char* s = "D.T.Software";
char buf[] = {}; // strcpy(buf, s); // 这里会造成内存越界;
// strncpy(buf, s, sizeof(buf) - 1); // 最多拷贝 n 个字符,这里 C 语言中的解决方案不好,增加了新的函数,但是名字让人费解;
strcpy(buf, s, sizeof(buf)-); printf("%s\n", buf); return ;
}

2,输出结果:

  D.T.Soft

3,重载函数 strcpy(buf, str, n) 的意义:

  1,通过函数重载扩展了已有的 strcpy(buf, str) 功能,使得它从原来的两个参数的状态变成了三个参数,安全性提高了,但是对于开发者而言调用的是同一个函数,并且容易记忆;

8,重载能够扩展系统中已经存在的函数功能,重载是否也能够扩展其他更多的功能?

1,可以,操作符重载;

9,下面复数解决方案是否可行?

1,代码示例:

 class Comples
{
public:
int a;
int b;
}; int main()
{
Complex c1 = {, };
Complex c2 = {, };
Complex c3 = c1 + c2; return ;
}

2,通过重载扩展 “+” 的功能,使得它能够对非实数的复数进行加减;

10,小结:

1,类的成员函数之间可以进行重载;

2,重载必须发生在同一个作用域中;

3,全局函数和成员函数不能构成重载关系;

4,重载的意义在于扩展已经存在的功能;

C++类中的函数重载的更多相关文章

  1. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

  2. C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. c++程序设计中的函数重载

    函数重载的意思是在一个作用域内(命名空间内)定义了某个或某些具有相同名称的函数,但是他们的参数列表和定义(实现)不相同,如果相同的话,就没啥意义了.当调用一个重载函数时,编译器会通过所使用的参数类型. ...

  5. 【java&c++】父子类中同名函数的覆盖问题

    java和c++两门语言对于父子类中同名函数具有不同的处理方式. 先上两段代码: C++: class Basic { public: void test(string i){ cout <&l ...

  6. js中的函数重载

    函数重载与js 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,也就是说用 ...

  7. c++中的函数重载、函数重写、函数重定义

    目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...

  8. C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  9. 类中成员函数与数据成员private/pubic/protected

    类中成员函数与数据成员private/pubic/protected

随机推荐

  1. C++ std::vector 总结笔记

    Initialization #include<iostream> #include<vector> using namespace std; int main() { vec ...

  2. postman—随机数和Monitors

    postman做重复测试时,随机数就有很大的作用,不用每次都输入 在postman的Params中,输入一个左大括号,会显示三种随机数: 也可以在body中设置 随机数如下: {{$guid}}:添加 ...

  3. consul windows下搭建

    起源 由于项目在linux部署,但是开发和测试是在windows下的,所以,暂时接触到consul,暂时也不会远程连接,只好在windows下安装consul 过程 去官网下载:https://www ...

  4. shell变量与运算

    shell变量与运算 @(0003 shell编程) 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$号,只有引用变量的值时才使用$号.也就是说在内存中,标记变量的变量名称是str,而不 ...

  5. shell java应用启动脚本(app.sh)

    #!/bin/sh # java服务中需要的jar文件或classpath路径,如业务程序.第三方jar文件log4j等 ShellAbsPath=$(cd "$(dirname " ...

  6. Spring Cloud云服务架构 - commonservice-config配置服务搭建

    1. 介绍 Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与 ...

  7. wannafly 练习赛11 E 求最值(平面最近点对)

    链接:https://www.nowcoder.com/acm/contest/59/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...

  8. 同一个tomcat部署多个项目11

    在开发项目中,有时候我们需要在同一个tomcat中部署多个项目,小编之前也是遇到了这样的情况,碰过不少的壁,故整理总结如下,以供大家参考.(以Linux为例,其他系统同样适用) 一.首先将需要部署的项 ...

  9. 2018-2019-2 网络对抗技术 20165220 Exp 8 Web基础

    2018-2019-2 网络对抗技术 20165220 Exp 8 Web基础 实验任务 (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与PO ...

  10. modern php笔记---2.1、特性(命名空间、特性、性状)

    modern php笔记---2.1.特性(命名空间.特性.性状) 一.总结 一句话总结: legend2是真的非常好用,资质起码提升5倍,也就是学习效率提升了起码5倍 1.命名空间实质? 从技术层面 ...