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. Jenkins-ssh远程执行nohup- java无法退出

    一,初步 #执行方式 ssh 192.168.2.103 " nohup java -jar /home/a/ipf/ight/feedback/ixxxedback-platform-1. ...

  3. json解析工具类

    对jackson的ObjectMapper的封装: ObjectMapperUtils: import static com.fasterxml.jackson.core.JsonFactory.Fe ...

  4. 使用 CSS 显示 XML

    通过使用 CSS,可为 XML 文档添加显示信息. 使用 CSS 显示您的 XML? 使用 CSS 来格式化 XML 文档是有可能的. 下面的例子就是关于如何使用 CSS 样式表来格式化 XML 文档 ...

  5. 设置获取data-*属性值

    html代码如下: <div id="getId" data-id="122" data-vice-id="11">获取id&l ...

  6. java语言对比,jvm,垃圾回收

    1.java/c++/ruby/python集中语言的对比 java和c++ 1,没有指针 2,没有多继承 3,没有const 4,在实现多态上的区别    tc++里面的虚函数,纯续函数和java里 ...

  7. 测试常用命令之awk篇

    awk/gawk 1,内置变量 FILENAME:输入文件名称 FNR:当前数据文件中的数据行数 NF:数据文件中的字段总数 NR:已处理的输入数据行数目 FS:输入数据段分隔符 RS:输入数据行分隔 ...

  8. centos7 安装 chrome

    1. 配置yum源 在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo cd /etc/yum.repos.d/ vim google-chrome.repo ...

  9. 【机器学习速成宝典】模型篇04k近邻法【kNN】(Python版)

    目录 什么是k近邻算法 模型的三个基本要素 构造kd树 kd树的最近邻搜索 kd树的k近邻搜索 Python代码(sklearn库) 什么是K近邻算法(k-Nearest Neighbor,kNN) ...

  10. clr/c++自定线程安全集合

    代码如下: 难点重写索引器.重写基类方法.基类方法显示调用示例 generic <class T> public ref class SyncList : public List<T ...