重载流运算符
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 ) ;
谭浩强《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+重载了运算符 . 重载了运算符+. 重载了运算符 为了说明在运算符重载后,执行表达式就是调用函 为了说明在运算符重载后, 数的过程, 数的过程,可以把两个整数相加也想像为调用下面 的函数: 的函数:
可以重载的运算符

可以重载的运算符随着程序设计语言的发展,越来越多的重载运算符的机会出现。
通过重载运算符,可以方便地对自定义类型进行操作,并提高代码的可读性和可维护性。
以下是一些可以重载的运算符:1. 一元运算符:重载一元运算符可以改变一个对象的状态或值。
常见的一元运算符包括:+(正号)、-(负号)、*(指针)、&(取地址符)、~(按位取反)等。
2. 二元运算符:重载二元运算符可以改变两个对象之间的运算方式。
常见的二元运算符包括:+(加号)、-(减号)、*(乘号)、/(除号)等。
在C++中,还可以重载操作符用于比较操作,如==、!=、<=、>=等。
3. 赋值运算符:重载赋值运算符可以对自定义类型进行赋值操作。
默认的赋值运算符只是简单地复制对象的值,而且会存在浅拷贝和深拷贝的问题。
4. 下标运算符:重载下标运算符可以通过对象数组形式来访问对象中的元素。
这种运算符对于自定义容器和数据结构非常有用。
5. 函数调用运算符:重载函数调用运算符可以让对象具有函数行为。
通过这种方式,可以实现自定义类型的函数调用和参数传递。
6. 前置/后置增量运算符:重载前置/后置增量运算符可以使得对象的值增加或减少。
前置增量运算符在对象的值被使用之前首先递增对象的值,而后置增量运算符在对象的值被使用后递增对象的值。
7. 强制类型转换运算符:重载强制类型转换运算符可以将自定义类型转换为其他数据类型,例如将一个类的对象转换为bool值或整数值等。
通过重载运算符,可以轻松地实现自定义类型的强类型检查和操作。
但是,在重载运算符时应该注意保持一致性和正确性,以确保代码的正确性和可维护性。
重载操作符

74:重载操作符、类成员函数还是友元函数
运算符重载两种形式
• (1)定义类的成员函数(2)定义类的友元函数
注意事项
• (1)一般作为类的成员函数,其形参操作符看起来比操作数数 目少1.因为作为成员函数的操作符存在一个隐含的this形参, 限定为第1个操作数。 • (2)重载一元操作符,如果作为成员函数就没有形参,作为友 元函数就有一个形参。 • (3)重载二元操作符,如果作为成员函数有一个形参,作为友 元函数有两个形参。 • (4)一般将关系和算术操作符声明为友元函数,将赋值操作符 定义为成员函数。
以上两种实现方式随存在一定的差异,但是其功能基本相同。 然而出现一下情况 CComplex d=CComplex(1,2); CComplex sum= 2+d;? 采用成员函数则不通过,友员函数则可以通过。 如果运算符采用友员函数实现,左右参数都可进行隐式转换, 而如果采用成员函实现则只允许右参数隐式转换。 运算符友员函数实数现时,操作数的隐式转换会增加程序执行 成本。
74:重载操作符、类成员函数还是友元函数
(1) 双目运算符重载为类的成员函数时,函数只显式说 明一个参数,该形参是运算符的右操作数。 (2) 前置单目运算符重载为类的成员函数时,不需要显 式说明参数,即函数没有形参。 (3) 后置单目运算符重载为类的成员函数时,函数要带 有一个整型形参。 调用成员函数运算符的格式如下: <对象名>.operator <运算符>(<参数>) 它等价于 <对象名><运算符><参数> 例如:a+b等价于a.operator +(b)。一般情况下,我们 采用运算符的习惯表达方式。
74:重载操作符、类成员函数还是友元函数
c++学习资料第 06 章 运算符重载

第 6 章 运 算 符 重 载
{ return Complex( c.Real, c.Image ); } void Complex::print()const { cout << '(' << Real << " , " << Image << ')' << endl; } void main() { Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; Complex c ; c = c1 c2 ; // operator(c1,c2) c.print() ; c = 25 + c2 ; // operator+(25,c2) c.print() ; c = c2 + 25 ; // operator+(c2,52) c.print() ; c = c1 ; // operator(c1) c.print() ; } 当一个运算符的操作需要修改类对象状态时,应该以成员函数重载。例如,需要左值操 作数的运算符(如 =,*=,++ 等)应该用成员函数重载。如果以友员函数重载,可以使用 引用参数修改对象。 当运算符的操作数(尤其是第一个操作数)希望有隐式转换,则重载算符时必须用友员 函数或普通函数。 C++中不能用友员函数重载的运算符有 = () [] -> 6.3 几个典型运算符重载 本节讨论在数学类中常用的几个运算符重载的特点和应用。 6.3.1 重载 ++ 与 自增和自减运算符有前置和后置两种形式。每个重载运算符的函数都必须有明确的特 征,使编译器确定要使用的版本。C++规定,前置形式重载为一元运算符函数,后置形式重 载为二元运算符函数。 【例 64】例 62 中使用了成员函数重载++和运算符。本例用友员函数重载++运算符。 设有简单类定义 class Increase { public : Increase() ; … friend Increase operator ++ ( Increase & ) ; friend Increase operator ++ ( Increase & , int ) ; private : unsigned value ; } ; 则前置重载的实现为: Increase operator++ ( Increase & a ) { a.value ++ ;
operator重载运算符的理解

operator重载运算符的理解英文版Understanding the Overloading of the Operator in C++In the realm of programming, operators are symbols that perform specific tasks on data. In C++, these operators can be overloaded, meaning their default behavior can be altered to perform user-defined operations. This flexibility adds a significant amount of power to the language, enabling developers to create more intuitive and user-friendly interfaces.What is Operator Overloading?Operator overloading is a concept in C++ that allows programmers to redefine the behavior of existing operators for user-defined types. This means that you can create a class and define how operators like +, -, *, /, ==, etc., behave when applied to objects of that class.Why Use Operator Overloading?Operator overloading is useful in several scenarios. Here are a few reasons why you might want to overload an operator:Intuitiveness: It allows objects to behave like built-in types, making code more readable and intuitive.Convenience: It removes the need to create separate functions for every operation, simplifying code.Encapsulation: It hides the implementation details of a class, providing a cleaner and more abstracted interface.How to Overload Operators?Operator overloading in C++ is done by defining a function within a class that has the same name as the operator you want to overload. Here's a simple example of how to overload the + operator for a custom class ComplexNumber:cppCopy class ComplexNumber {private:double real;double imag;public:ComplexNumber(double r, double i) : real(r), imag(i) {} // Overload the + operatorComplexNumber operator+(const ComplexNumber& other) {return ComplexNumber(real + other.real, imag + other.imag);}// Other member functions and operators...};class ComplexNumber {private:double real;double imag;public:ComplexNumber(double r, double i) : real(r), imag(i) {} // Overload the + operatorComplexNumber operator+(const ComplexNumber& other) {return ComplexNumber(real + other.real, imag + other.imag);}// Other member functions and operators...};In this example, the + operator is overloaded to add two ComplexNumber objects together, component-wise.Best Practices and ConsiderationsWhen overloading operators, there are a few best practices and considerations to keep in mind:Consistency: Ensure that the overloaded operator behaves consistently with its default behavior and with other overloaded operators.Intuitive Naming: Use operator names that are intuitive and consistent with the language's syntax.Avoid Overuse: Don't overuse operator overloading. It should be done sparingly and only when it adds clarity and convenience.Documentation: Provide clear documentation explaining the behavior of overloaded operators.ConclusionOperator overloading is a powerful feature of C++ that allows developers to create more intuitive and user-friendly interfaces. However, it should be used judiciously, following best practices to ensure code clarity and maintainability. By understanding the concepts and considerations behind operator overloading, you can harness its power to create more expressive and efficient code.中文版理解C++中的运算符重载在编程领域,运算符是对数据执行特定任务的符号。
c++结构体重载运算符

c++结构体重载运算符C++结构体可以通过重载运算符来实现自定义的操作符行为。
重载运算符允许我们使用结构体对象与其他对象之间进行类似于内置数据类型的操作。
下面将介绍一些常用的运算符重载的方式以及其使用场景。
1. 算术运算符重载:- 重载+运算符:可以用于结构体对象之间的相加操作。
- 重载-运算符:可以用于结构体对象之间的相减操作。
- 重载*运算符:可以用于结构体对象与标量之间的乘法运算。
- 重载/运算符:可以用于结构体对象与标量之间的除法运算。
2. 关系运算符重载:- 重载==运算符:用于比较两个结构体对象是否相等。
- 重载!=运算符:用于比较两个结构体对象是否不相等。
- 重载<运算符:用于比较两个结构体对象的大小关系。
- 重载>运算符:用于比较两个结构体对象的大小关系。
- 重载<=运算符:用于比较两个结构体对象的大小关系。
- 重载>=运算符:用于比较两个结构体对象的大小关系。
3. 赋值运算符重载:- 重载=运算符:用于将一个结构体对象的值赋给另一个对象。
- 重载+=运算符:用于将一个结构体对象与另一个对象相加,并将结果赋给第一个对象。
- 重载-=运算符:用于将一个结构体对象与另一个对象相减,并将结果赋给第一个对象。
- 重载*=运算符:用于将一个结构体对象与标量相乘,并将结果赋给第一个对象。
- 重载/=运算符:用于将一个结构体对象与标量相除,并将结果赋给第一个对象。
4. 输入输出运算符重载:- 重载<<运算符:用于将结构体对象的数据输出到标准输出流。
- 重载>>运算符:用于从标准输入流中读取数据,并赋给结构体对象的成员变量。
运算符重载的基本语法如下:```返回类型 operator运算符(参数列表) {// 重载运算符的实现代码// 可以直接访问结构体对象的成员变量// 可以调用结构体对象的方法// 可以与其他对象进行运算// 返回运算结果}```在进行运算符重载时,需要注意以下几点:- 重载运算符必须是成员函数或友元函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重载流运算符
流运算符是C++中一种重要运算符,可以改变对象内容的表示方式或效率,以及语言本身的可编程性。
它由C语言演化而来,有着广泛的应用。
随着现代程序设计的发展,流运算符也在不断发展,现在支持重载。
重载的流运算符允许程序员使用自定义类型的运算符,以更高效的方式操作对象。
因此,在某些情况下,重载的流运算符可以提高程序的可维护性和可移植性。
重载的流运算符可以给类添加复杂的行为,从而增强类的有用性。
通过实现cout << x,可以使数据生成一个可读性较高的格式,而不用写很多代码。
例如,程序员可以使用cout << x来输出数组的内容,而不必对每个元素进行单独的输出。
重载的流运算符还可以改善设计模式,带来更多可能性和更优的编程实践。
它可以用来帮助程序员更有效地实现复杂的功能。
例如,它可以帮助程序员将复杂的面向对象程序设计模式应用到自定义类
型中。
重载的流运算符也为程序员提供了另一种表达数据结构和实现
抽象数据类型的方式。
虽然它在C++11标准中定义,但它在实践中可以用于实现其他类型的标准,并且可以应用于不同的编程环境中。
总而言之,重载的流运算符为C++程序设计提供了一种更加高效和灵活的方式,它可以提高程序员的编程效率,并且能够有效缩短代码的行数。
它广泛应用于各种C++领域,如核心编程、数据结构和抽
象数据类型等,也是编程实践中最重要的一项技术。