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 文件:
#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++类中的函数重载的更多相关文章
- C++解析(16):友元与类中的函数重载
0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...
- C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- c++程序设计中的函数重载
函数重载的意思是在一个作用域内(命名空间内)定义了某个或某些具有相同名称的函数,但是他们的参数列表和定义(实现)不相同,如果相同的话,就没啥意义了.当调用一个重载函数时,编译器会通过所使用的参数类型. ...
- 【java&c++】父子类中同名函数的覆盖问题
java和c++两门语言对于父子类中同名函数具有不同的处理方式. 先上两段代码: C++: class Basic { public: void test(string i){ cout <&l ...
- js中的函数重载
函数重载与js 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,也就是说用 ...
- c++中的函数重载、函数重写、函数重定义
目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 类中成员函数与数据成员private/pubic/protected
类中成员函数与数据成员private/pubic/protected
随机推荐
- HBase 权限控制
HBase的权限管理依赖协协处理器.所以我们需要配置hbase.security.authorization=true,以及hbase.coprocessor.master.classes和hbase ...
- 算法复习_线性时间求解Majority Vote Algorithm问题
题目来源于Leecode上的Majority Element问题 Majority Element:在一个序列中出现了至少n/2的下界次 使用排序算法取中位数则需要Nlogn http://www.c ...
- HTTS TTLS 433
HTTP和HTTPS协议,看一篇就够了 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/x ...
- UML——概述
1. 静态视图(类图) 静态视图不描述与时间相关的系统行为,这种行为在其他视图中描述,因此称之为静态试图. 静态视图用类图来实现,正因为它以类图为中心,因此也称之为类图. ...
- 南京网络赛C
分段打表大法好!!! 打表40min,A题1s https://nanti.jisuanke.com/t/41300 #include<bits/stdc++.h> #define int ...
- nodejs 文件操作
前言: nodejs 自带的文件操作的模块 fs 就是对文件的增删查改: 就像我们用的服务器,我们没有办法在运行的文件上进行一直的修改,因为他不向浏览器,刷新后我们的文件会自己修改: 如果想要更改我 ...
- HDU6534 Chika and Friendly Pairs(莫队,树状数组)
HDU6534 Chika and Friendly Pairs 莫队,树状数组的简单题 #include<bits/stdc++.h> using namespace std; cons ...
- webpack的安装和运行
webpack依赖于node,为了可以正靠运行,必须依赖node环境.node环境为了可以真正的执行很多代码,必须其中包含各种依赖的包npm工县(node packages manager)所以在进行 ...
- 使用foreach进行批量更新
public void addEmps(@Param("emps")List<Employee> emps); 2映射文件配置 <!-- 批量保存 --> ...
- Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView、TTreeViewItem
Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView.TTreeViewItem TScrollBox -> TCustomTreeView -> ...