91菡数重载 ●●●●● 在重载函数中使用默认参数也可能造成二义性。8 ●●●● int fun(int a, int b=1, int c=2, int d= 3).] 那么使用下列调用是合法的: fun(5,6,7)//第4个参数默认,值为3 fun(5,6)∥/第3、4个参数默认,值为2、3 fun(5∥/第2、3、4个参数默认,值为1、2、3 而对下面两个函数,就会发生二义性 int fun(int a, int b=oi return a+ b; y t fun (int a)i return a+ aiy 调用函数fun(5)F <心画
9.1 函数重载 在重载函数中使用默认参数也可能造成二义性。 int fun(int a, int b=1, int c=2, int d= 3){…} 那么使用下列调用是合法的: fun(5, 6, 7); // 第4个参数默认,值为3 fun(5, 6); // 第3、4个参数默认,值为2、3 fun(5); // 第2、3、4个参数默认,值为1、2、3 而对下面两个函数,就会发生二义性 int fun(int a, int b= 0) { return a + b; } int fun(int a) { return a + a; } 调用函数 fun(5);
9.2运算符重载 ●●●●● C++语言除了函数重载之外,还允许程序员重新定义有 的运算符,使其能按用户的要求完成一些特定的操作,这就是 所谓的运算符重载。例如,在C+十系统内,对运算符+、-、* \这四种运算符已有规定,他们是整数和实数的四则运算符。 但如果需要对复数、分数或其他操作数作四则运算,那么就要 对+、-、*、\重新进行定义。 运算符重载是对已有的运算符赋予多重含义,同一个运算 符作用于不同类型的数据导致不同类型的行为。C++中预定义 的运算符的操作对象只能是基本数据类型,实际上,对于很多 用户自定义类型,也需要有类似的运算操作,这就提出了对运 算符进行重新定义,赋予已有符号以新功能的要求 运算符重载的实质就是函数重载。在实现过程中,首先把 指定的运算表达式转化为对运算符函数的调用,运算对象转化 为运算符函数的实参,然后根据实参的类型来确定需要调用的 函数,这个过程是在编译过程中完成的。 <心画
9.2 运算符重载 C++语言除了函数重载之外,还允许程序员重新定义已有 的运算符,使其能按用户的要求完成一些特定的操作,这就是 所谓的运算符重载。例如,在C++系统内,对运算符+、-、 * 、 \ 这四种运算符已有规定,他们是整数和实数的四则运算符。 但如果需要对复数、分数或其他操作数作四则运算,那么就要 对+、-、 * 、\ 重新进行定义。 运算符重载是对已有的运算符赋予多重含义,同一个运算 符作用于不同类型的数据导致不同类型的行为。C++中预定义 的运算符的操作对象只能是基本数据类型,实际上,对于很多 用户自定义类型,也需要有类似的运算操作,这就提出了对运 算符进行重新定义,赋予已有符号以新功能的要求。 运算符重载的实质就是函数重载。在实现过程中,首先把 指定的运算表达式转化为对运算符函数的调用,运算对象转化 为运算符函数的实参,然后根据实参的类型来确定需要调用的 函数,这个过程是在编译过程中完成的
9.2运算符重载 ●●●●● 例如,运算符+在系统中预先是按函数做如下定义:8 ●●● int operator +(int, int)i ●●●● double operator +(double double); 如果我们可以实现两个复数x和y相加表示为x+y,两个字符 串s1和s2相加表示为s1+s2,那么整个程序更加符合逻辑和 自然,所以,运算符重载是C++多态性的一个重要应用。 运算符重载中应注意的几个问题: (1)哪些运算符可以重载: 除了*,,;, sizeof(,P:其他运算符都可以重载 (2)运算符重载后遵循“四个不变”原则 优先级不变 结合性不变 操作数个数不变 语法结构不变 <心画
9.2 运算符重载 例如,运算符+在系统中预先是按函数做如下定义: int operator + (int, int) ; double operator + (double, double); 如果我们可以实现两个复数x和y相加表示为x+y,两个字符 串s1和s2相加表示为s1+s2,那么整个程序更加符合逻辑和 自然,所以,运算符重载是C++多态性的一个重要应用。 运算符重载中应注意的几个问题: (1)哪些运算符可以重载: 除了* ,.,::,sizeof(),?: 其他运算符都可以重载 (2)运算符重载后遵循“四个不变”原则 优先级不变 结合性不变 操作数个数不变 语法结构不变
9.2运算符重截 (3)运算符重载是针对新类型数据的实际需要,对原有运算 符进行适当的改造。一般来讲,重载的功能应当与原有功能相 类似,不能改变原运算符的操作对象个数,同时至少要有一个 操作对象是自定义类型。 (4)运算符重载实际上是通过定义一个函数来实现的,运算 符重载归根结底是函数的重载,编译系统选择重载的运算符时 根据操作数的个数和类型,这是跟函数重载的选择是类同的。 运算符的重载形式有两种 用户定义的重载运算符,要求能访问运算对象的私有成员,所 以分重载为类的成员函数和重载为类的友元函数,格式如下 <函数类型> operator<运算符>(<形参表>) <函数体> friend<函数类型> operator<运算符>(<形参表>) 函数体>; <心画
9.2 运算符重载 (3)运算符重载是针对新类型数据的实际需要,对原有运算 符进行适当的改造。一般来讲,重载的功能应当与原有功能相 类似,不能改变原运算符的操作对象个数,同时至少要有一个 操作对象是自定义类型。 (4)运算符重载实际上是通过定义一个函数来实现的,运算 符重载归根结底是函数的重载,编译系统选择重载的运算符时 根据操作数的个数和类型,这是跟函数重载的选择是类同的。 运算符的重载形式有两种: 用户定义的重载运算符,要求能访问运算对象的私有成员,所 以分重载为类的成员函数和重载为类的友元函数,格式如下: <函数类型> operator <运算符>(<形参表>) { <函数体>; } friend <函数类型> operator <运算符>(<形参表>) { <函数体>; }
9.2运算符重载 ●●●●● 其中,<函数类型>指定了重载运算符的返回值类型, operator是定义运算符重载函数的关键词,<运算符>给定了 要重载的运算符名称,是C++中可重载的运算符,形参表中给 出重载运算符所需要的参数和类型。对于运算符重载为友元函 数的情况,还要在函数类型说明之前使用 friend关键词来说明。 当运算符重载为类的成员函数时,函数的参数个数比原来 的运算数个数要少一个,即单目运算符重载时无参数,而实际 参数就是该对象本身,而双目运算符重载时一个参数,而实际 上,右操作数是参数,左操作数就是该对象本身;当重载为类 的友元函数时,参数个数与原运算数的个数相同。 般来讲,单目运算符最好重载为成员函数,而双目运算 符则最好重载为友元函数。运算符重载的主要优点就是允许改 变使用于系统内部的运算符的操作方式,以适应用户新定义类 型的类似运算 <心画
9.2 运算符重载 其中,<函数类型>指定了重载运算符的返回值类型, operator是定义运算符重载函数的关键词,<运算符>给定了 要重载的运算符名称,是C++中可重载的运算符,形参表中给 出重载运算符所需要的参数和类型。对于运算符重载为友元函 数的情况,还要在函数类型说明之前使用friend关键词来说明。 当运算符重载为类的成员函数时,函数的参数个数比原来 的运算数个数要少一个,即单目运算符重载时无参数,而实际 参数就是该对象本身,而双目运算符重载时一个参数,而实际 上,右操作数是参数,左操作数就是该对象本身;当重载为类 的友元函数时,参数个数与原运算数的个数相同。 一般来讲,单目运算符最好重载为成员函数,而双目运算 符则最好重载为友元函数。运算符重载的主要优点就是允许改 变使用于系统内部的运算符的操作方式,以适应用户新定义类 型的类似运算