重载函数

4.0 C++远征:重载运算符

感情迁移 提交于 2020-02-05 05:25:12
目录 重载运算符 四、重载运算符 1.一元运算符重载 2.二元运算符重载 重载运算符 四、重载运算符 ​ 概念 : 给原有运算符赋予新功能。 ​ 本质 : 函数重载。 ​ 关键字 : operator 1.一元运算符重载 ​ 符号只与一个操作数进行运算。 Ⅰ -(负号)的重载(取反啊) 友元函数重载 // Coordinate.hpp class Coordinate { friend Coordinate& operator-(Coordinate &coor); public: Coordinate(int x, int y); private: int m_iX; int m_iY; }; // Coordinate.cpp Coordinate& Coordinate::operator-(Coordinate &coor) { coor.m_iX = -coor.m_iX; coor.m_iY = -coor.m_iY; return *this; } // main.cpp int main() { Coordinate coor(3, 5); -coor; // operator-(coor); return 0; } ​ 成员函数重载 // Coordinate.hpp class Coordinate { public: Coordinate(int x, int

C++之运算符重载(二元)

本秂侑毒 提交于 2020-02-05 05:24:44
一、加号+ 1.成员函数重载 2.友元函数重载 二、输出符号<< 三、索引符号 [ ] 四、补充说明 1.《二元运算符重载》课程评论: (一)为什么<<运算符的重载必须定义为友元 如果在类中定义非友元成员函数,默认第一个参数默认会传入this*指针,这时就无法实现cout在前<<对象在后的格式 因为二元运算符中的调用格式是 参数一 运算符 参数二 这也就是为什么 加号运算符可以使用非友元成员函数,因为参数一是一个this*指针,参数二是其它对象 假设定义为非友元成员函数,那么第一个参数系统默认为this*(且无法更改),第二个参数是cout 那么调用格式就变成了 coor << cout了,这就是不能定义为非友元成员函数的原因 (二) 这里对于输出运算符重载讲得一般,当时课程上学习的时候,这里返回值为out是有原因的。 cout<<coor1<<coor2<<endl; 上面这个例子中,第一次重载<<的时候cout作为第一个参数,coor作为第二个参数,返回出来out的引用,这个out引用的是"cout<<coor1", 第二次重载的时候是将这个cout<<coor1整个作为out流对象,做成第一个参数。 2.《二元运算符重载》课程评论: 来吧!让我给您们解释一下为什么<<只能友元,而[]只能成员重载; 简而言之: <1> 对于友元重载没有this指针指向当前对象的

C++重载运算符的形式及规则

狂风中的少年 提交于 2020-02-04 09:48:37
C++重载运算符的形式及规则 运算符实际上是一个函数,所以运算符的重载就是函数的重载。 1 、那么重载运算符是干什么用的呢? C++的数据类型分为两种:基本数据类型、构造数据类型。 基本数据类型可以通过运算符直接完成算术运算。 类作为新构造的数据类型,同样可以使用直接运算。例如: # include <iostream> using namespace std ; class C { public : int x ; C ( int i ) { x = i ; } } ; int main ( ) { C p1 ( 2 ) ; C p2 ( 3 ) ; cout << p1 . x + p2 . x << endl ; return 0 ; } 程序可以正确输出结果5,但是使用运算符直接求和形式单一、不利于复制,如果要实现多个对象的累加其代码的可读性会大大降低。 使用重载运算符方法就可以解决这些问题。 2、重载运算符的声明形式 如下: operator 类型名 ( ) ; operator是需要重载的运算符,整个语句没有返回类型,因为类型名就代表了它的返回类型。重载运算符将对象转换成类型名规定的类型,转换时的形式就像强制转换一样,但如果没有重载运算符定义,直接用强制转换编译器将无法通过编译。 重载运算符不可以是新创建的运算符,只能说C++语言中已有的运算符。 可以重载的运算符如下:

python3 重写、重用、重载

和自甴很熟 提交于 2020-02-04 06:36:17
重用 重用是用于在对象的概念中,实现代码的重用性 在继承角度,在子类继承父类之后,重新使用父类属性方法即是代码的重用 在组合角度,在一个类中以另外一个类的对象作为数据属性,提高代码的重用性 重用的方式: 继承: 方式一:指名道姓的应用某一个类中的函数(无关继承,访问函数不存在自动传值) 例如:CollegePeople.__init__(self, name, age, sex) 方式二:使用内置方法super(),返回特殊对象访问属性(严格依赖mro列表,存在自动传值) 例如:super().__init__( name, age, sex) 组合:通过为某一个对象添加属性的方式,间接将两个类进行关联,减少类与类代码冗余 class Foo: xxx = 222 class Bar: yyy = 111 obj = Foo() b = Bar() obj.attr = Bar() obj.a = b obj.xxxx #调用Foo内属性 obj.attr.yyyy #调用Bar内属性 重写 重写用于继承概念下,子类继承父类需要同名的不同函数,即可修改重写同名方法。 例如: class Parent: # 定义父类 def myMethod(self): print '调用父类方法' class Child(Parent): # 定义子类 def myMethod(self):

STL源码剖析(适配器)

有些话、适合烂在心里 提交于 2020-02-04 06:07:42
STL中由三类适配器,它们分别是: 1.容器适配器(stack、queue) 2.迭代器适配器(insert_iterator、reverse_iterator、iostream_iterator) 3.函数适配器(bind1st等等) 容器适配器 关于容器适配器我们已经在前面的http://www.cnblogs.com/runnyu/p/6003821.html讲过了。 迭代器适配器 1.insert iterator 当我们这样使用copy算法的时候: 1 vector<int> ins = { 1, 3, 5, 7}; 2 vector<int> coll; // coll为空 3 copy(ins.begin(), ins.end(), coll.begin()); View Code 毫无疑问会出现错误,因为copy算法中调用的是iterator的operator*跟operator=,用的是赋值操作,而要进行赋值的iterator并不合法。 insert iterator可以解决这个问题,其实它的实现很简单。 下面是back_inserter的用法跟实现,它的实现主要是重载了operator*跟operator=方法,然后提供了一个接口函数。 1 // 以容器为参数 将元素copy到coll的末尾 2 copy(ins.begin(), ins.end(), back

关于C++全局重载运算符的两点注意

亡梦爱人 提交于 2020-02-04 02:27:09
全局运算符重载要注意函数的声明 全局运算符重载中的等号是浅拷贝,并非深拷贝。 代码如下: # include <iostream> using namespace std ; class Person ; Person operator + ( const Person & p1 , const Person & p2 ) ; // 注意函数的声明 class Person { public : int m_A ; int m_B ; } ; void test01 ( ) { Person p1 ; p1 . m_A = 5 ; p1 . m_B = 3 ; Person p2 ; p2 . m_A = 2 ; p2 . m_B = 7 ; // 关于什么时候调用拷贝构造函数,什么调用等号的载载,可以参考其他资料 // 简单举例如下: // Person t = p1; // 调用拷贝构造函数,因为t还没有被被始化 // ---------- // Person t; // t = p1; // 调用等号的重载,因为t已经被构造,初始化 Person p3 = p1 + p2 ; // 此处使用的默认拷贝构造函数为浅拷贝 cout << "p3.m_A = " << p3 . m_A << endl ; cout << "p3.m_B = " << p3 . m_B <<

初识C++函数重载

一世执手 提交于 2020-02-02 23:46:46
文章目录 函数重载 什么是函数重载 为什么要函数重载 函数重载中要注意的一些细节 函数重载与作用域 函数匹配【重载确定】 重载和const形参 const_cast和函数重载 函数重载 什么是函数重载 函数重载是指在同一作用域内, 函数名相同 而 形参列表不同 的一组函数。 编译器首先将调用的实参与重载集合中每一个函数的形参作比较,然后根据比较的结果决定调用哪一个函数。 为什么要函数重载 重载函数通常用来命名一组功能相似的函数,增强了程序的可读性,函数重载在一定程度上减轻了程序员起名字,记名字的负担。 比如操作符重载在本质上也是函数重载,其大大丰富了已有操作符的含义,方便记忆和使用。 函数重载中要注意的一些细节 函数重载与作用域 如果我们在内层作用域中声明名字,那么它将隐藏外层作用域中声明的同名实体,在不同的作用域中无法重载函数名。 函数匹配【重载确定】 函数匹配【重载确定】是指一个过程,在这个过程中我们把函数调用与一组重载函数中的某一个关联起来。 编译器首先将调用的实参与重载集合中每一个函数的形参作比较,然后根据比较的结果决定调用哪一个函数。 大多数情况下,重载集合中的函数区别明显,它们要么是函数形参的数量不同,要么是函形参类型毫无关系,这种情况下确定调用哪一个函数是比较容易的。但是当两个重载函数的形参数量相同且形参类型之间可以相互转换时,如何选择函数就值得我们注意了

重写与重载

冷暖自知 提交于 2020-02-02 04:33:21
重写方法的规则如下: 1. 参数列表:必须与被重写方法的参数列表完全匹配。 2. 返回类型:必须与超类中被重写的方法中声明的返回类型或子类型完全相同 3. 访问级别:一定不能比被重写方法强,可以比被重写方法的弱。 4. 非检查异常:重写方法可以抛出任何非检查的异常,无论被重写方法是否声明了该异常。 5. 检查异常:重写方法一定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常 6. 不能重写标志为final,static的方法 重载方法的规则: 1. 参数列表:被重载的方法必须改变参数列表。 2. 返回类型:可以改变返回类型。 3. 修饰符:可以改变修饰符 4. 异常:可以声明新的或者更广泛的异常。 class Animal { public void eat(){ } } 以下列出对于Animal的eat方法各种重写重载实例,根据以上列出的规则,判断其是否合法(以下的方法都属于Animal的子类Horse的方法): 1. private void eat(){} 不能通过编译,非法重写,访问修饰符限制性变强;不属于重载,因为参数列表没有发生改变 2. public void eat() throw RuntimeException{} 能通过编译,属于重写,重写方法可以抛出任何非检查异常。 3. public void eat() throw IOException

Java 重写(Override)与重载(Overload)

♀尐吖头ヾ 提交于 2020-02-02 01:00:36
重写(Override):重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参 都不能改变。 即外壳不变,核心重写! 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。 以上的编译时不被通过的,因为在animal中并没有定义bark方法,所以dog的对象里面的bark方法并不能被animal内省的b运行,算不上重写 参数列表必须完全与被重写方法的相同; 返回类型必须完全与被重写方法的返回类型相同; 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。 父类的成员方法只能被它的子类重写。 声明为final的方法不能被重写。 声明为static的方法不能被重写,但是能够被再次声明。 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。 重写的方法能够抛出任何非强制异常

重载和重写的区别与联系

别等时光非礼了梦想. 提交于 2020-02-01 11:45:48
这三个概念都是与Java中的多态有关系的。如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了, 下面说说它们的区别吧。 重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。 覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。 隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了。隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就是在 多态的实现上。    什么叫多态?简单地说就是一个接口,多种实现吧。 覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数!    重载(overload):   必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个 是重载的重要特征   必须在一个域中,而继承明显是在两个类中 相同的函数名的函数,在基类和派生类中的关系只能是覆盖或者隐藏。 隐藏(hide): 指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上 查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名