运算符重载和类型转换

合集下载

c 运算符的重载习题答案

c  运算符的重载习题答案

1.概念填空题1.1运算符重载是对已有的运算符赋予多重含义,使同一个运算符在作用于不同类型对象时导致不同的行为。

运算符重载的实质是函数重载,是类的多态性特征。

1.2可以定义一种特殊的类型转换函数,将类的对象转换成基本数据类型的数据。

但是这种类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。

类类型转换函数既没有参数,也不显式给出返回类型。

类类型函数中必须有return 表达式的语句返回函数值。

一个类可以定义多个类类型转换函数。

1.3运算符重载时其函数名由operator运算符构成。

成员函数重载双目运算符时,左操作数是对象,右操作数是函数参数。

2.简答题2.2简述运算符重载的规则。

2.2简述重载单目运算符++、--,前置和后置时的差别。

2.3 C++中重运算符是否都可以重载?是否都可以重载成类的成员函数?是否都可以重载成类的友元函数?2.4 构造函数作为类型转换函数的条件是什么。

3.选择题3.1在下列运算符中,不能重载的是(B)A.!B. sizeofC. newD. delete3.2 不能用友员函数重载的是(A)。

A.=B.==C.<=D.++3.3下列函数中,不能重载运算符的函数是(B)。

A.成员函数B.构造函数C.普通函数D.友员函数3.4如果表达式++i*k时中的”++”和”*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为(B)。

A.operator*(i.operator++(),k) B.operator*(operator++(i),k)C.i.operator++().operator*(k) D.k.operator*(operator++(i))3.5已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;下列关于这个函数的叙述中,错误的是(B )。

A.这是运算符-的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变数据成员的值3.6在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。

C++基础系列——运算符重载

C++基础系列——运算符重载

C++基础系列——运算符重载1. 运算符重载简介所谓重载,就是赋予新的含义。

函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。

同样运算符重载(Operator Overloading)可以让同⼀个运算符可以有不同的功能。

可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据也可以⾃定义运算符重载:class Complex{public:Complex();Complex(double real, double imag);Complex operator+(const Complex &a) const;void display() const;private:double m_real;double m_imag;};// ...// 实现运算符重载Complex Complex::operator+(const Complex &A) const{Complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this -> m_imag + A.m_imag;return B;// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);}int main(){Complex c1(4.3, 5.8);Complex c2(2.7, 3.7);Complex c3;c3 = c1 + c2; // 运算符重载c3.display();return 0;}运算结果7 + 9.5i运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。

运算符重载

运算符重载

// 顺序错误
.
27
由于使用友元会破坏类的封装,要尽量将运算 符重载函数定义为成员函数。
除非有特殊需要,才使用友元函数重载运算符。
.
28
4.5重载双目运算符
双目的意思是运算符左边和右边的操作数均参 加运算。
如果要重载 B 为类的成员函数,使之能够实 现表达式 oprd1 B oprd2,其中 oprd1 为A 类 对象,则 B 应被重载为 A 类的成员函数,形 参类型应该是 oprd2 所属的类型。
.
24
加法运算符重载为友元函数,C++ 在编译时将表达式 c1+c2解释为
operator + ( c1, c2) 即相当于执行以下函数
Complex operator + ( Complex & c1, Complex & c2 ) {
return Complex( c1.real + c2.real , c1.imag + c2.imag ) ; }
.
3
运算符重载的实质
运算符重载是对已有的运算符赋予多重含义。
必要性:C++中预定义的运算符其运算对象只 能是基本数据类型,而不适用于用户自定义类 型(如类)
实现机制
将指定的运算表达式转化为对运算符函数的调用, 运算对象转化为运算符函数的实参。
编译系统对重载运算符的选择,遵循函数重载的选 择原则。
friend Complex operator + ( int & i , Complex & c )
{
return Complex( c.real + i , c.imag ) ;

作业13

作业13

HZAU-专业C++作业13(运算符重载)判断题1. 所有的运算符都可以重载。

F2.在C++中,编译时的多态性是通过函数和运算符的重载实现的。

T3. 运算符重载是通过对已有的运算符重新定义操作功能来实现的,它是C++语言多态性的一种表现。

T4. 运算符重载只可以是类的成员函数和友元函数,不可以是普通函数。

T5. 运算符重载是通过函数来实现的,定义运算符重载函数时,函数名中要使用关键字operator。

T6. 运算符重载后,优先级、结合性和操作数都是不变的。

T7. 重载运算符的函数也可以设置默认参数。

F8. 使用成员函数方法和使用友元函数的方法所定义的重载运算符函数的参数个数是不相同的。

T9. 运算符“.”、“::” 、“?:” 不能重载T10. 运算符=、()、[]和-&gt;可作为类成员运算符, 不能作为友员运算符。

T选择题1.下列运算符中,(A )运算符在C++中不能重载。

A. ?:B. [ ]C. newD. &&2.下列运算符不能用友元函数重载的是(c)。

A. +B. =C. *D. <<3.在一个类中可以对一个操作符进行( D )重载。

A. 1种B. 2种及以下C. 3种及以下D. 多种4.友元运算符obj1>obj2被C++编译器解释为( A )。

A. operator > (obj1, obj2)B. > (obj1, obj2)C. obj2.operator > (obj1)D. obj1.operator > (obj2)5.下列关于C++运算符函数的返回类型的描述中,错误的是( C )。

A. 可以是类类型B. 可以是int类型C. 可以是void类型D. 可以是float类型6.下列关于运算符重载的描述中,正确的是( D )。

A. 运算符重载可以改变运算符的操作数的个数B. 运算符重载可以改变优先级C. 运算符重载可以改变结合性D. 运算符重载不可以改变语法结构7.先加一然后再使用的++运算符的重栽形式是(A)。

谭浩强《C++程序设计》课件 第10章

谭浩强《C++程序设计》课件 第10章

通过运算符重载,扩大了 通过运算符重载,扩大了C++已有运算符的作用范 已有运算符的作用范 使之能用于类对象. 围,使之能用于类对象. 运算符重载对C++有重要的意义,把运算符重载和 有重要的意义, 运算符重载对 有重要的意义 类结合起来,可以在C++程序中定义出很有实用意 类结合起来,可以在 程序中定义出很有实用意 义而使用方便的新的数据类型.运算符重载使C++ 义而使用方便的新的数据类型.运算符重载使 具有更强大的功能,更好的可扩充性和适应性, 具有更强大的功能,更好的可扩充性和适应性,这 最吸引人的特点之一. 是C++最吸引人的特点之一. 最吸引人的特点之一
c.imag=imag+c2.imag; return c;} void Complex∷display( ) //定义输出函数 ∷ 定义输出函数 {cout<<〃(〃<<real<<〃,〃<<imag<<〃i)〃<<endl;} int main( ) {Complex c1(3,4),c2(5,-10),c3; c3=plex_add(c2); cout<<〃c1=〃; c1.display( ); cout<<〃c2=〃; c2.display( ); cout<<〃c1+c2=〃; c3.display( ); return 0; }
Complex operator+ (Complex& c1,Complex& c2);
在定义了重载运算符的函数后,可以说: 在定义了重载运算符的函数后,可以说: 函数 operator+重载了运算符 . 重载了运算符+. 重载了运算符 为了说明在运算符重载后,执行表达式就是调用函 为了说明在运算符重载后, 数的过程, 数的过程,可以把两个整数相加也想像为调用下面 的函数: 的函数:

C++笔记——在模板类中重载操作符

C++笔记——在模板类中重载操作符
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
C++笔记 ——在模板类中重载操作符
实现了一个Matrix模板类,以此为例记录一下在模板类中重载常用的运算符。
不是所有运算符都可以重载,不能被重载的运算符有:长度运算符sizeof,条件运算符?,成员选择运算符.,域解析运算符::
23 Matirx<T> operator+(T1 a){
24
Matirx<T> temp(row, col);
25
for(int i = 0; i < row * col; i++)
26
values[i] += (T)a;
27
return temp;
28 }
29
30 template <typename T1>
9
Matirx<T> tmp(1, col);
10
for(int i = 0; i < col; ++i)
11
tmp.values[i] = values[(r - 1) * col + i];
12
return tmp;
13 }
10.其他
除了面提到的运算符,常用的运算符还有复合运算符(比如+=,*=)和方括号运算符[](用于支持随机访问)以及delete和delete[] 运算符, 由于这些运算符重载方式都大同小异,基本上能在以上的几种中找到差不多的例子,不再赘述。
重载操作符需要特别注意的一点是函数的参数表和返回值的形式。
重载操作符有两种方法,一种是重载为成员函数,一种是重载为友元。

可以重载的运算符

可以重载的运算符

可以重载的运算符随着程序设计语言的发展,越来越多的重载运算符的机会出现。

通过重载运算符,可以方便地对自定义类型进行操作,并提高代码的可读性和可维护性。

以下是一些可以重载的运算符:1. 一元运算符:重载一元运算符可以改变一个对象的状态或值。

常见的一元运算符包括:+(正号)、-(负号)、*(指针)、&(取地址符)、~(按位取反)等。

2. 二元运算符:重载二元运算符可以改变两个对象之间的运算方式。

常见的二元运算符包括:+(加号)、-(减号)、*(乘号)、/(除号)等。

在C++中,还可以重载操作符用于比较操作,如==、!=、<=、>=等。

3. 赋值运算符:重载赋值运算符可以对自定义类型进行赋值操作。

默认的赋值运算符只是简单地复制对象的值,而且会存在浅拷贝和深拷贝的问题。

4. 下标运算符:重载下标运算符可以通过对象数组形式来访问对象中的元素。

这种运算符对于自定义容器和数据结构非常有用。

5. 函数调用运算符:重载函数调用运算符可以让对象具有函数行为。

通过这种方式,可以实现自定义类型的函数调用和参数传递。

6. 前置/后置增量运算符:重载前置/后置增量运算符可以使得对象的值增加或减少。

前置增量运算符在对象的值被使用之前首先递增对象的值,而后置增量运算符在对象的值被使用后递增对象的值。

7. 强制类型转换运算符:重载强制类型转换运算符可以将自定义类型转换为其他数据类型,例如将一个类的对象转换为bool值或整数值等。

通过重载运算符,可以轻松地实现自定义类型的强类型检查和操作。

但是,在重载运算符时应该注意保持一致性和正确性,以确保代码的正确性和可维护性。

c++编写运算符重载十六进制加减乘除转换

c++编写运算符重载十六进制加减乘除转换

c++编写运算符重载十六进制加减乘除转换本文介绍如何使用C++编写运算符重载,实现对十六进制数进行加减乘除操作,并且可以在不同进制间进行转换。

我们将对C++中的运算符重载、进制转换等知识进行详细讲解,让读者能够更深入地了解C++编程语言。

首先,我们将介绍如何对十六进制数进行加减乘除运算。


C++中,运算符重载可以让我们自定义运算符的行为。

我们可以使用运算符重载来实现对十六进制数的加减乘除运算。

在编写运算符重载时,我们需要定义运算符的行为,例如加法运算符的行为应该是将两个十六进制数相加,并返回结果。

其次,我们将介绍如何进行进制转换。

在实际的开发中,我们经常需要将不同进制的数字进行转换。

例如,我们可能需要将一个十六进制数转换成二进制或者十进制。

在C++中,我们可以使用一些函数来实现进制转换,例如hex、oct、dec函数。

这些函数分别可以将一个十六进制数、八进制数、十进制数转换成其他进制的数字。

最后,我们将把上述知识点合并起来,编写一个可以进行十六进制数的加减乘除运算,并且可以在不同进制之间进行转换的程序。

通过这个程序,读者可以更加深入地了解C++语言中的运算符重载、进制转换等知识点。

- 1 -。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主要内容



运算符重载的目的 运算符重载概述 重载的规则和限制 如何重载运算符 常见运算符的重载 类型转换 小结
class Complex { public: Complex(float r=0, float i=0) { real=r; image=i;} Complex add(const Compex &c) { return Complex(real + c.real, image+c.image);} private: float real, image; };
>>=
Байду номын сангаас
<<=”,

若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则 只能选用友元函数。 当需要重载运算符的运算具有可交换性时,选择重载为友元函数。 >> << 作为提取和插入运算符使用时,只能用友元函数重载
void main() { int i = 29, j = 870, k; float x = 2.6, y = 2.4; k = i + j; float z = x + y; Complex c1(3.2,4.6), c2(6.2,8.7), c3; c3 = c1.add(c2); }
运算符重载概述
重载为类的友元函数


此时运算所需的操作数都是通过函数的参数表来传递,在参数表中形 参从左到右的顺序就是运算符操作数的顺序。 双目运算符 B重载后, (ch18_2) 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, B oprd 等同于 operator B(oprd ) 后置单目运算符 ++和- -重载后,此时函数的形参有两个,一个是类 的对象,另一个是整型(int)形参 oprd B 等同于 operator B(oprd,0 )
重载为类的成员函数


双目运算符 B 如果要重载 B 为类的成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的 成员函数,形参类型应该是 oprd2 所属的类型。 经重载后, oprd1 B oprd2 相当于 oprd1.operator B(oprd2) 前置单目运算符 U 如果要重载 U 为类成员函数,使之能够实现表达式 U oprd, 其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数, 无形参。经重载后,表达式 U oprd 相当于 oprd.operator U()


运算符是一些系统预定义的函数名称,即用一些特定的符号 表示各种运算。每个运算符对运算数据都有一定要求。 C++中预定义的运算符的操作对象只能是基本数据类型,实 际上,对于很多用户自定义类型,也需要有类似的运算操作, 这就提出了对运算符进行重新定义,赋予已有符号以新功能 的要求。

运算符重载是对已有的运算符赋予多重含义,同一个运算符 作用于不同类型的数据导致不同类型的行为。
运算符函数

定义运算符重载函数的一般格式: <type> operator @(<arg>) { ...... //函数体 } type为函数返回值的类型;@为要重载的运算符;arg为函数的形参表,


operator是关键字,它与其后的运算符一起构成函数名。 为了提高访问效率,运算符重载函数通常需要直接访问对象的私有或保护的 数据成员,因此运算符重载函数通常为类的成员函数或者友元函数。


后置运算符“++” 和“ ” 如果要实现表达式oprd++或oprd ,其中oprd为A 类 对象,那么运算符重载函数中要带一个整型(int)形参。 经 重载后, oprd++ 相当于 oprd.operator ++(0) oprd 相当于 oprd.operator (0) 前增量与后增量的区别 使用前增量时,对对象(操作数)进行增量修改,然后 再返回该对象,参数与返回的是同一个对象 使用后增量时,必须在增量之前返回原有的对象。后增 量操作返回的是原有对象值,不是原有对象,原有对象已 经被增量修改。


习惯形式 a+b -a a++
友元调用形式 operator+(a,b) operator-(a) operator++(a,0)
成员调用形式 a. operator+(b) a. operator-( ) a. operator+(0)
成员与友元运算符函数选取经验


对于单目运算符,建议选择成员函数。 对于运算符“= ()[ ] -> ”只能作为成员函数。 对于运算符“ += -= /= *= &= != ~= %= 建议重载为成员函数。 对于其他运算符,建议重载为友元函数。 类型转换函数只能定义为一个类的成员函数。
运算符重载的实质就是函数重载。在实现过程中,首先把指 定的运算表达式转化为对运算符函数的调用,运算对象转化 为运算符函数的实参,然后根据实参的类型来确定需要调用 的函数,这个过程是在编译过程中完成的。

运算符重载的规则和限制

不可以重载的运算符有:. .* :: ?: sizeof 只能重载C++语言中已有的运算符,不可臆造新的。 运算符重载后优先级和结合性都不会改变, 不能改变操作数个数,单目只能重载为单目运算符,双目只能重载为双目运算 符 不能改变运算符对预定义类型数据的操作方式,即重载运算符时,其操作数 中至少应该有一个是自定义类型。 重载的运算符应保持其原有的基本语义。 C++ 规定:= -> ( ) [ ] 只能重载为成员函数形式: >> << 作为提取和插入运算符使用时,只能用友元函数重载
两种重载形式的比较

对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函 数带有两个参数;对单目运算符而言,成员运算符函数不带参数,而 友元运算符函数带有一个参数 。 双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但 有一种情况必须使用友元函数,如加法运算。 运算符函数调用形式
相关文档
最新文档