重载函数

c++学习记录(七)

南楼画角 提交于 2020-02-08 00:15:41
c++学习实践之重载 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同 c++类中有重载运算符和重载函数 重载函数 声明多个相似但形式参数个数或者类型不同的函数,编译器通过把你所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。 (1)例子 #include<iostream> using namespace std; class Num { public: void print(int a) { cout << "返回整数:" << a << endl; } void print(double a) { cout << "返回浮点数:" << a << endl; } }; int main() { Num num; num.print(1); num.print(1.11111); } (2)分析 Num类中有两个函数名相同但形参类型不同的函数,调用相同函数,输入不同类型数据,编译器会自动选取合适的函数输出结果 (3)结果 重载运算符 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。大多数的运算符可以重载,以下运算符不可重载。 .成员访问运算符 . , -> 成员指针访问运算符 ::域运算符

C++ 继承的多态性: 重载父类函数(虚方法)

社会主义新天地 提交于 2020-02-07 21:49:42
C++ 的继承复杂, 在 上一章 中讲解了基础部分 在用的时候不妨会想到: 如果在派生类中重载了基类的函数呢? 那么这就是本篇要讲的----继承的多态性. 百度百科 中对继承的多态性有详细的解释:   多态性就是 多种表现形式 ,具体来说,可以用" 一个对外接口,多个内在实现方法 "表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。   C++的多态性:在基类的函数前面加上 virtual 关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。 父类被标有 virutual 的函数称为: 虚方法 . 在子类中重载基类的函数只要在父类函数声明部分加上 override 关键字即可. 再说白一点, 也就是将父类某函数的功能替换掉了, 但是函数的 '外观' 没有变: #include <iostream> class Father { public: virtual void get() // 创建了一个虚方法 { std::cout<<"Father"<<std::endl; } }; class Child: public

[Oh My C++ Diary]函数重载

笑着哭i 提交于 2020-02-07 00:26:02
函数重载 函数重载,指的是一组参数和返回值不同的函数共用一个函数名。 函数重载使一个函数名具有多种功能,即具有“多种形态”,称这种形态为多态性。 当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。 Example: #include <iostream> using namespace std; int abs(int x) { return x>=0?x:-x; } double abs(double x) { return x>=0?x:-x; } long abs(long x) { return x>=0?x:-x; } int main() { int x1 = 1; double x2 = -2.5; long x3 = 3L; cout<< "|x1| = " << abs(x1) << endl; cout<< "|x2| = " << abs(x2) << endl; cout<< "|x3| = " << abs(x3) << endl; return 0; } 来源: CSDN 作者: Lemonademei 链接: https://blog.csdn.net/Meiko1024/article/details/104200211

C++中数学运算、比较、赋值操作符的重载

扶醉桌前 提交于 2020-02-06 12:45:06
文章目录 1 操作符重载概念的引入 1.1 复数解决方案 1.2 操作符重载的概念 2 C++中操作符重载的两种实现方式 2.1 全局的操作符重载函数 2.2 类内的操作符重载函数 3 C++中数学运算、比较、赋值操作符的重载 3.1 完善的复数类 3.2 操作符重载的注意事项 1 操作符重载概念的引入 1.1 复数解决方案 下面的复数解决方案是否可行? 如果将上面代码直接进行编译,会出现编译错误。 可以自定义一个add函数: # include <stdio.h> class Complex { int a ; int b ; public : Complex ( int a = 0 , int b = 0 ) { this -> a = a ; this -> b = b ; } int getA ( ) { return a ; } int getB ( ) { return b ; } friend Complex Add ( const Complex & p1 , const Complex & p2 ) ; } ; Complex Add ( const Complex & p1 , const Complex & p2 ) { Complex ret ; ret . a = p1 . a + p2 . a ; ret . b = p1 . b + p2 . b ;

特化与重载

◇◆丶佛笑我妖孽 提交于 2020-02-06 05:50:59
现在我们已经知道如何使一个泛型定义扩展成一些相关的类家族和函数家族。但是有些时候,我们需要同一个名字的函数的不同实现( 透明定义 ),为的是在不同情况下获得较高的性能,在这种情况下就不是简单的参数替换就能够解决的。 一、透明定义使用的技术 对于函数模板使用的透明定义的技术是: 函数模板的重载 对于类模板的使用透明定义的技术是: 类模板的特化(全局特化和局部特化) 二、重载函数模板 两个名称相同的模板可以同时存在,还可以对他们进行实例化。 template<typename T> int f(T) { retrun 1; } template<typename T> //重载版本 int f(T*) { return 2; } 如果我们用int*来替换第一个模板参数T,用int来替换第二个模板参数T,那么将会获得两个具有相同参数类型和返回类型的同名函数。 int main() { cout << f<int*>((int*)0) << endl; //这里回实例化出两个实体,根据实参(int*)选择接近的 cout << f<int>((int*)0) << endl; //这里会实例化出两个实体,根据实参(int*)选择接近的 } 注意:表达式0是一个整数,而不是一个null指针常量。只有在发生特定的隐式转型之后参会成为一个null的指针常量

Step By Step(C++模板重载和特化)

十年热恋 提交于 2020-02-06 05:44:13
一、模板函数重载: 函数重载是一个非常通用亦非常容易理解的编程基础概念,既函数名相同而函数签名不同的一组函数,在实际的调用中,编译器会根据函数参数的不同自动选择最为合适且最为特化的函数。在推演的过程中,如果出现多个函数均符合该调用规则,编译器将根据其内置的特化规则,选择最为特殊的函数作为候选函数。然而如果仍有多个候选函数的话,编译器将报出二义性错误。和普通函数一样,在C++中模板函数也同样支持函数重载的功能,甚至可以将模板函数与普通函数混合在一起,以达到更为灵活的函数重载的效果。 在这里,我们对于函数重载的概念本身将不再做过多的赘述了,而是将重点放在模板函数重载的应用场景和应用技巧上。下面我将给出一个利用模板函数重载计算哈希值的代码示例: 1 #include <stdio.h> 2 3 template<typename T> 4 int hash_code(T v) { 5 return v.hashCode() * 2; 6 } 7 8 template<typename T> 9 int hash_code(T* v) { 10 return v->hashCode(); 11 } 12 13 int hash_code(const int v) { 14 return v + 100; 15 } 16 17 class HashClass { 18 public: 19

函数模板,函数模板重载,可变參数模板,函数模板覆盖,通过引用交换数据

跟風遠走 提交于 2020-02-06 05:33:44
 1. 函数模板0基础,假设想使用模板,须要实例化。实例化的方式是加上 < 数据类型 > #include <iostream> // 函数模板能够对类型进行优化重载。依据类型会覆盖 // 假设仍然要使用模板函数,须要实例化 template < class T > T add ( T a , T b ) { std :: cout << "T add " << std :: endl ; return a + b ; } int add ( int a , int b ) { std :: cout << "int add " << std :: endl ; return a + b ; } void main () { int a = 10, b = 20; double db1 = 10.9, db2 = 10.8; add ( db1 , db2 ); add ( a , b ); // 这里加上了 <int> 相当于实例化,调用了模板 add < int >( a , b ); std :: cin . get (); } 执行结果例如以下: 2. 模板的重载,模板的重载会依据数据类型自己主动匹配 #include <iostream> #include <array> using std :: array ; template < typename T >

MFC消息机制

断了今生、忘了曾经 提交于 2020-02-05 14:17:00
何谓消息、消息处理函数、消息映射? 消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你的一系列代码。称为消息处理函数。 在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。一个switch case语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。 但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switch case语句了,取而代之的是一个叫消息映射的东西。为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switch case,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。因此MFC采用了一种新的机制。利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。这种机制就是消息映射。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。这样做显然是高效的。 MFC提供的消息结构 同时MFC定义了下面的两个主要结构: AFX_MSGMAP

operator介绍

社会主义新天地 提交于 2020-02-05 05:47:09
operator是C++的关键字,它和运算符一起使用,表示一 个运算符函数,理解时应将operator=整体上视为一个函数名。 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。 一、为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只支持 基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等, 等等,则需要用户自己来定义关于这个操作符的具体实现。比如,判断两个人是否一样大,我们默认的规则是按照其年龄来比较,所以,在设计person 这个class的时候,我们需要考虑操作符==,而且,根据刚才的分析,比较的依据应该是age。那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,所以,需要用户自己来提供该参数版本的实现。 二、如何声明一个重载的操作符? A: 操作符重载实现为类成员函数 重载的操作符在类体中被声明,声明方式如同普通成员函数一样, 只不过他的名字包含关键字 operator ,以及紧跟其后的一个c++预定义的操作符 。 可以用如下的方式来声明一个预定义的==操作符: class

C++运算符重载

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-05 05:25:41
1、什么是运算符重载? (1)运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的 数据类型 。 因为在实际中确实有这种需求,例如将两个类对象直接相加,直接比较两个类对象的大小.....等等,因为普通的运算符 不能完成这种功能,所以在适当的时候对运算符进行重载,能够给我们的编程带来很大的方便。 (2)运算符函数定义的一般格式: <返回类型说明符> operator<运算符符号>(<参数表>) { <函数体> } 2、运算符重载的分类:一元运算符重载、二元运算符重载 一元运算符表示的是这中运算符只需要一个数参与运算,而二元运算符表示这种运算符需要两个数参与运算;例如:两个是相加的 "+"运算,就是一个二元运算符,两个数相乘的 "*" 运算符也是一个二元运算符;而 "++" "--",还有作为取反的负号运算符 "-" 等等都是一元运算符。 (1)一元运算符重载,本例子中使用 "-" 和 "++"运算符来演示一元运算符重载的使用," ++"运算符的两种重载方式:前置++、后置++ 按照运算符重载的方式来说,一般分为友元函数重载和成员函数重载两种方式,下面分别用代码进行说明: 1 #include <iostream> 2 using namespace std; 3 4 class Coordinate{ // 定义一个坐标类 5 public: 6