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
随机推荐
- C++ std::vector 总结笔记
Initialization #include<iostream> #include<vector> using namespace std; int main() { vec ...
- postman—随机数和Monitors
postman做重复测试时,随机数就有很大的作用,不用每次都输入 在postman的Params中,输入一个左大括号,会显示三种随机数: 也可以在body中设置 随机数如下: {{$guid}}:添加 ...
- consul windows下搭建
起源 由于项目在linux部署,但是开发和测试是在windows下的,所以,暂时接触到consul,暂时也不会远程连接,只好在windows下安装consul 过程 去官网下载:https://www ...
- shell变量与运算
shell变量与运算 @(0003 shell编程) 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$号,只有引用变量的值时才使用$号.也就是说在内存中,标记变量的变量名称是str,而不 ...
- shell java应用启动脚本(app.sh)
#!/bin/sh # java服务中需要的jar文件或classpath路径,如业务程序.第三方jar文件log4j等 ShellAbsPath=$(cd "$(dirname " ...
- Spring Cloud云服务架构 - commonservice-config配置服务搭建
1. 介绍 Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与 ...
- wannafly 练习赛11 E 求最值(平面最近点对)
链接:https://www.nowcoder.com/acm/contest/59/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...
- 同一个tomcat部署多个项目11
在开发项目中,有时候我们需要在同一个tomcat中部署多个项目,小编之前也是遇到了这样的情况,碰过不少的壁,故整理总结如下,以供大家参考.(以Linux为例,其他系统同样适用) 一.首先将需要部署的项 ...
- 2018-2019-2 网络对抗技术 20165220 Exp 8 Web基础
2018-2019-2 网络对抗技术 20165220 Exp 8 Web基础 实验任务 (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与PO ...
- modern php笔记---2.1、特性(命名空间、特性、性状)
modern php笔记---2.1.特性(命名空间.特性.性状) 一.总结 一句话总结: legend2是真的非常好用,资质起码提升5倍,也就是学习效率提升了起码5倍 1.命名空间实质? 从技术层面 ...