重载函数

C++函数重载,重写,重定义

99封情书 提交于 2019-12-09 15:58:36
转载自: https://www.cnblogs.com/MisterXu/p/10651889.html 目录 1 重载 2 重写 3 重定义 4 函数重载二义性    C++中经常会提到重载,除了重载,还有重写,重定义,下面对这三个概念逐一进行区分 1 重载    函数重载是同一定义域中(即同一个类中)的同名函数,但形参的个数必须不同,包括 参数个数,类型和顺序 ,不能仅通过返回值类型的不同来重载函数 #include<iostream> using namespace std; class BOX { void func(int a, int b, int c){} void func(int a, int b){} // 参数个数不同 void func(int c, int b, int a){} // 参数顺序不同 int func(int a, int b, int c){} // **返回值类型不同,不能说明是重载函数** }; int main() { BOX box; return 0; } 2 重写    在父类和子类中,并且函数形式完全相同,包括 返回值,参数个数,类型和顺序 ,    父类中有 vietual 关键字,可以发生 多态 #include<iostream> using namespace std; class BOX { virtual

[译]详解C++右值引用

拈花ヽ惹草 提交于 2019-12-09 14:33:49
C++0x标准出来很长时间了,引入了很多牛逼的特性 [1] 。其中一个便是右值引用,Thomas Becker的文章 [2] 很全面的介绍了这个特性,读后有如醍醐灌顶,翻译在此以便深入理解。 目录 概述 move语义 右值引用 强制move语义 右值引用是右值吗? move语义与编译器优化 完美转发:问题 完美转发:解决方案 Rvalue References And Exceptions The Case of the Implicit Move Acknowledgments and Further Reading 概述 右值引用是由C++0x标准引入c++的一个令人难以捉摸的特性。我曾偶尔听到过有c++领域的大牛这么说: 每次我想抓住右值引用的时候,它总能从我手里跑掉。 想把右值引用装进脑袋实在太难了。 我不得不教别人右值引用,这太可怕了。 右值引用恶心的地方在于,当你看到它的时候根本不知道它的存在有什么意义,它是用来解决什么问题的。所以我不会马上介绍什么是右值引用。更好的方式是从它将解决的问题入手,然后讲述右值引用是如何解决这些问题的。这样,右值引用的定义才会看起来合理和自然。 右值引用至少解决了这两个问题: 实现move语义 完美转发(Perfect forwarding) 如果你不懂这两个问题,别担心,后面会详细地介绍。我们会从move语义开始

使用智能指针解决可能导致的内存泄漏的问题

て烟熏妆下的殇ゞ 提交于 2019-12-08 11:12:30
一个程序中可能会因为各种情况导致内存泄漏的问题,程序泄漏可能不会一下子被写程序的人发现,因为它可能是一点点的被泄漏,直到内存被耗尽之后才会知道内存泄漏这个问题,但是我们不应该写出这样的程序来坑我们自己。因此在写程序的时候应该尽量避免这类问题的产生 执行流跳转是什么??在一个程序顺序往下执行的时候,在遇到return , break, goto,continue等语句的时候,就会引发执行流跳转。假如说我们在程序开头部分new了一个变量或其他,那么与它配套使用的delete就应该出现在它的下一句,但是可能在他们两中间要有一些条件执行,这些条件中的某些语句可能引发程序结束或退出,那么后面的delete语句则不会被执行,也就是说我们前面申请的空间没有还给系统,这样就会导致内存的泄漏。 如何解决这个问题?RAII(资源分配即初始化)就可以解决。RAII是一种解决问题的思想,用一个类来封装资源的分配和释放,不是具体的某种实现的类或者函数,基于它的思想提出的智能指针是解决问题的根本。 智能指针在快速发展的互联网发展过程中也分为如下几类: AutoPtr:自动指针管理权转移 template < class T> class AutoPtr { public : AutoPtr(T* ptr) :_ptr(ptr) {} ~AutoPtr() { if (_ptr) { cout << "haha

C#关于函数重载的坑

橙三吉。 提交于 2019-12-06 17:03:42
今天在调用被重载的函数时,发现一个问题 private ProductRegisterResponse InitResponse(int code, string message, string pwidsecurity = null, string serialno = null) { ProductRegisterResponse response = new ProductRegisterResponse { PWIDSECURITY = pwidsecurity, SERIALNO = serialno, Status = code, Message = message, };//返回基类 return response; } private ResponseBase InitResponse(int code, string message) { ResponseBase response = new ResponseBase { Status = code, Message = message, };//返回基类 return response; } 在我这样调用函数时 ProductRegisterResponse a = InitResponse(1, "参数错误!") 在我调用函数时,我的返回值类型是ProductRegisterResponse,但却会报错

[转帖]Java中重写和重载与多态的关系

我怕爱的太早我们不能终老 提交于 2019-12-06 13:45:30
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_34383019/article/details/100550142 重写(Override) 重写指的是子类对父类可允许访问的方法进行重新编写,两者有相同的名称,相同参数,相同返回值,但是内容却不相同,子类的新方法将覆盖父类中原有的方法。 重载(Overload) 重载是在同一个类中,方法名称相同,参数不同。这样同名不同参的方法被称为重载。 重载VS重写 重写规则: 1、父类成员发放只能被它的子类重写 2、子类方法的访问修饰符一定要大于父类的访问修饰符(public>protected>default>private)。 3、子类和父类在同一包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。 4、子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非final 方法。 5、声明为 final 的方法不能被重写。 6、声明为 static 的方法不能被重写,但是能够被再次声明。 7、子类方法的参数列表

重载函规则

穿精又带淫゛_ 提交于 2019-12-06 12:17:09
1.首先编译器会让函数调用的时候会进行精确的匹配 2.如果精确匹配不成功,接着尝试类型转换,如果转换之后,能够匹配某个版本,也能调用成功 3.函数调用的时候。出现两个版本都匹配的情况,编译器是不会编译通过。 4.注意函数的默参数地 情况 1 void func() { cout << "调用一成功" << endl; } void func(int a,int b) { cout<< "调用二成功" << endl; } void func(int a,int b,int c){} void test() { int a = 10; int b = 10; int c = 10; func(); func(c, b); func(a,b,c); } 来源: https://www.cnblogs.com/MyLoveLiJuan/p/11982767.html

C++面向程序设计(第二版)课后习题答案解析

怎甘沉沦 提交于 2019-12-06 11:06:51
最近没什么心情整理零散的知识点,就整理一下第四章的课后习题答案。 1.定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。将运算符函数重载为非成员函数,非友元的普通函数。编程序,求两个复数之和。 源代码: 1 #include <iostream> 2 #include<stdlib.h> 3 using namespace std; 4 class Complex 5 {public: 6 Complex(){real=0;imag=0;} 7 Complex(double r,double i){real=r;imag=i;} 8 double get_real();//获取实部函数 9 double get_imag();//获取虚部函数 10 void display();//显示函数 11 private: 12 double real; 13 double imag; 14 }; 15 16 //实现具体的函数 17 double Complex::get_real() 18 { 19 return real; 20 } 21 double Complex::get_imag() 22 { 23 return imag; 24 } 25 void Complex::display() 26 { 27 cout<<"("<<real<<","<

C++学习(7)—— 函数提高

风流意气都作罢 提交于 2019-12-06 10:54:02
1. 函数默认参数 在C++中,函数的形参列表中的形参是可以有默认值的 语法: 返回值类型 函数名 (参数=默认值){} 注意 如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值 如果函数的声明有了默认参数,那么函数的实现就不可以有默认参数 #include<iostream> using namespace std; //函数的默认参数 //如果我们自己传入数据,就用自己的数据,如果没有,那么用默认值 int func(int a, int b=20, int c=30){ return a+b+c; } //注意事项 //1. 如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值 //2. 如果函数的声明有了默认参数,那么函数的实现就不可以有默认参数 int main(){ cout<<func(10,30)<<endl; return 0; }   2. 函数的占位参数 C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置 语法: 返回值类型 函数名(数据类型){} #include<iostream> using namespace std; //占位参数 //占位参数 可以有默认参数 void func(int a, int = 10){ cout<<"this is func"<<endl; } int

【Oracle_Package】Oracle的Package的作用及用法 【20140612】

心不动则不痛 提交于 2019-12-06 08:27:23
Oracle的Package的作用 简化应用设计、提高应用性能、实现信息隐藏、子程序重载。 1、Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)? 你不觉得把存储过程分门别类是很重要的么,而且不同的package的存储过程可以重 名。 用package不仅能把存储过程分门别类,而且在package里可以定义公共的变量/类型,既方便了编程,又减少了服务器的编译开销。 2、如何把现有的存储过程加入到Package中? copy and pasty,不过调用的时候要带包名了。 3、除了使用SQL Plus,还有没有什么工具做Package? 也有方便的第三方工具了,不过得自己找了。 用第三方工具吧,比如sql navigator。www.quest.com 4、使用SQL Plus编译Package,是否每次都是编译Package中所有的存储过程? 是 包也是一种命名pl/sql块,和存储过程、函数一下,都是在数据库启动的时候就载入内存的。开销的大小很难判断,因为你不用包,但是要完成包的功能的话,还是要用PL/SQL来完成的,服务器一样有开销。相对来说,用包少了SQL的语法分析、解释过程,开销还少一点。 “过程一般都不超过20行”那我倒很少遇到。用不用子过程关键要看是不是能定义可重用的子过程,用子过程效率不会低。 包的作用 :

运算符重载

落花浮王杯 提交于 2019-12-06 05:06:11
1. 双目运算符类成员函数重载 观察下列程序,掌握双目运算符的类成员函数重载方式。 #include<iostream> using namespace std; class complex { double real, imag; public: complex(double r = 0, double i = 0) { real = r; imag = i; } complex operator + (complex&); //运算符重载的成员函数原型 //运算符结果类型 operator @(参数表列); 其中,@表示运算符 void print(); }; /*运算符重载实现: 函数返回类型 类名::operator @(参数表列) { //代码 }*/ complex complex::operator+(complex& c) { //operator+ 是类complex的成员函数 complex sum; sum.real = real + c.real; sum.imag = imag + c.imag; return sum; } void complex::print() { cout << "real=" << real << endl; cout << "imag=" << imag << endl; } void main() { complex a(5