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. ftp CentOS7安装

    1.安装ftp服务yum install vsftpd 2.修改ftp配置文件(/etc/vsftpd/vsftpd.conf)ascii_upload_enable=YESascii_downloa ...

  2. ASP教程:gb2312和utf-8乱码问题解决

    文章为转载:https://www.xp.cn/b.php/31663.html 尊重作者版权 今天做网站的时候,客户要一个博客,于是就利用了本博客所用的程序pjblog.经常做网站的人都知道,在同一 ...

  3. SQL limit(分页)

    1.limit使用 limit参数,第一个参数:从哪儿开始查:第二个参数:查几条 i : 为查询结果的索引值(默认从0开始): n : 为查询结果返回的数量  -- 从3开始 取 3 条 SELECT ...

  4. 【转】django rest framework ModelSerializer 、serializers小结

    转自:https://blog.csdn.net/l_vip/article/details/79156113 引言 serializers是什么?官网是这样的”Serializers allow c ...

  5. Apache Drill 调研学习

    Apache Drill 调研学习 ## 一.Drill概述 在大数据时代,对于Hadoop中的信息,越来越多的用户需要能够获得快速且互动的分析方法.大数据面临的一个很大的问题是大多数分析查询都很缓慢 ...

  6. springMVC @response 中文乱码解决

    以下任选一种 在web.xml中: 添加一个过滤器(filter),注册 org.springframework.web.filter.CharacterEncodingFilter <filt ...

  7. @清晰掉 makefile

    参阅: http://www.cnblogs.com/wang_yb/p/3990952.html

  8. JavaScript-Load-Image

    如何将图片显示为canvas https://github.com/blueimp/JavaScript-Load-Image/blob/master/js/load-image-scale.js h ...

  9. 2017-03-04 idea破解

    https://blog.csdn.net/qq_27686779/article/details/78870816 防止原址被删除,备份下,亲测可用 http://idea.java.sx/ 简单快 ...

  10. Python深度学习读书笔记-2.初识神经网络

    MNIST 数据集 包含60 000 张训练图像和10 000 张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即 ...