C++中运算符重载详解及其作用介绍

发布时间:2026/7/13 5:45:31
C++中运算符重载详解及其作用介绍 概述运算符重载 (Operator Overloading)函数重载重载: 将同一名字重新赋予新的含义.函数重载: 对一个函数赋予新的含义, 使之实现新功能. 例如:12intmax(intx,inty);doublemax(doublea,doubleb,doublec);运算符也有重载: 赋予运算符新的含义, 使之一名多用. 例如123456789101112intmain() {inti 2, j 3;intk i j;string s1 good , s2 morning;string s3 s1 s2;cout k endl;cout s3 endl;return0;}输出结果:5good morning运算符重载通过运算符重载, 扩大了 C 已有运算符的作用, 使运算符能用于类对象. 使用运算符重载, 能使程序易于编写, 阅读和维护. 运算符被重载后, 其原有的功能仍然保留, 没有丧失过改变.运算符重载实质上是函数的重载:定义一个重载运算符的函数需要执行被重载的运算符时, 系统就自动调用该函数, 以实现相应的运算C 的运算符算数运算符: (加) -(减) *(乘) %(整除余数) (自加) – (自减)关系运算符: (大于) (小于) (等于) (大于等于) (小于等于) !(不等于)逻辑运算符: (逻辑与) ||(逻辑或) !(逻辑非)位运算符: (按位左移) (按位右移) (按位与) |(按位或) ∧(按位异或) ~(按位取反)赋值运算符: 及其扩展赋值运算符条件运算符: ?:都好运算符: ,指针运算符: *引用运算符合地址运算符: 求字节数运算符: sizeof强制类型转换运算符: (类型) 或 类型()成员运算符: .指向成员的运算符:-下标运算符: []其他: 如函数调用运算符 ()重载运算符的规则不允许创造新的运算符, 只能对已有 C 运算符进行重载.C 允许重载运算符: 成员运算符(.), 成员指针访问运算符(.*), 域运算符(:, 求字节数运算符(sizeof), 条件运算符(?重载不能改变运算符运算对象 (即操作数) 的个数重载不能改变运算符的优先级别重载不能改变运算符的结合性重载运算符的函数不能有默认的参数重载的运算符必须和用户定义的自定义类型的对象一起使用. 参数至少有一个是类对象或其 引用成员函数实现 Complex 加法Complex 类:123456789101112131415#ifndef PROJECT2_COMPLEX_H#define PROJECT2_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(doubler,doublei);Complex add(Complex c2);voiddisplay();};#endif //PROJECT2_COMPLEX_HComplex.cpp:12345678910111213141516171819#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) : real(r), imag(i) {}Complex Complex::add(Complex c2) {Complex c;c.real real c2.real;c.imag imag c2.imag;returnc;}voidComplex::display() {cout ( real , ;cout imag i) endl;}main:123456789101112intmain() {Complex c1(3, 4), c2(5, -10), c3;cout c1 ;c1.display();cout c2 ;c2.display();c3 c1.add(c2);cout c1 c2 ;c3.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c1 c2 (8, -6i)运算符重载的方法运算符重载格式:1函数类型 operator 运算符名称 (形参流标) {对运算符的重载处理}Complex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();Complex operator(Complex c2);};#endif //PROJECT4_COMPLEX_HComplex.cpp:12345678910111213141516171819#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex Complex::operator(Complex c2) {Complex c;c.real real c2.real;c.imag imag c2.imag;returnc;}main:1234567891011121314151617#include iostream#include Complex.husingnamespacestd;intmain() {Complex c1(3, 4), c2(5, -10), c3;cout c1 ;c1.display();cout c2 ;c2.display();c3 c1 c2;cout c1 c2 ;c3.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c3 (8, -6i)多种实现方法成员函数实现:123456Complex Complex::operator(Complex c2) {Complex c;c.real real c2.real;c.imag imag c2.imag;returnc;}简化:123Complex Complex::operator(Complex c2){returnComplex(real c2.real, imag c2.image);}友元函数实现:123Complex operator(Complex c1, Complex c2){......}实现 operatorComplex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();Complex operator(constComplex c);};#endif //PROJECT4_COMPLEX_HComplex.cpp:123456789101112131415161718#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex Complex::operator(constComplex c) {real c.real;// this-real c.real;imag c.imag;// this-imag c.imag;return*this;}main:1234567891011121314151617#include iostream#include Complex.husingnamespacestd;intmain() {Complex c1(3, 4), c2(5, -10), c3;cout c1 ;c1.display();cout c2 ;c2.display();c1 c2;cout c1 ;c1.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c1 (8, -6i)三种运算符重载函数运算符重载函数可以是类的成员函数:它可以通过 this 指针自由地访问本类的数据成员. 少写一个函数的参数, 但有要求.运算符重载函数可以是类的友元函数:如果运算符左侧的操作属于 C 标准类型 (如 int) 或是一个其他类的对象, 则运算符重载函数不能选用成员函数. 为方便访问类的私有成员, 声明为友元函数为佳.运算符重载函数还可以是普通函数:只有极少的情况下才使用 (因普通函数一般不能直接访问类的私有成员)成员函数实现Complex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();Complex operator(doubled);// 成员函数实现};#endif //PROJECT4_COMPLEX_HComplex.cpp:12345678910111213141516#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex Complex::operator(doubled) {returnComplex(real d, imag);}友元函数实现Complex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();friendComplex operator(Complex c,doubled);// 友元函数};#endif //PROJECT4_COMPLEX_HComplex.cpp:12345678910111213141516#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex operator(Complex c,doubled) {returnComplex(c.real d, c.imag);}输出结果main:123456789101112131415161718#include iostream#include Complex.husingnamespacestd;intmain() {Complex c1(3, 4), c2(5, -10), c3, c4;cout c1 ;c1.display();cout c2 ;c2.display();c3 c1 3.14;cout c3 ;c3.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c3 (6.14, 4i)重载单元运算符单元运算符 (unary operation), 即只有一个运算量. 如: !a, -b, c, *p, i, i-- 等.例子重载单元运算符实现分数对象的相反数.Fraction 类:12345678910111213141516171819#ifndef PROJECT4_FRACTION_H#define PROJECT4_FRACTION_H#include iostreamusingnamespacestd;classFraction {private:intnume;// 分子intdeno;// 分母public:Fraction();Fraction(int,int);Fraction operator-(constFraction c);// 分数相减Fraction operator-();// 取反一目运算friendostream operator(ostream output,constFraction f);};#endif //PROJECT4_FRACTION_HFraction.cpp:12345678910111213141516171819#include Fraction.hFraction::Fraction() : nume(0), deno(0) {}Fraction::Fraction(intn ,intd) : nume(n), deno(d) {}Fraction Fraction::operator-(constFraction c) {returnFraction(nume*c.deno - c.nume*deno, deno*c.deno);}Fraction Fraction::operator-() {returnFraction(-nume, deno);}ostream operator(ostream output,constFraction f) {doubleresult (double)f.nume / f.deno;output result endl;returnoutput;}main:123456789101112131415#include iostream#include Fraction.husingnamespacestd;intmain() {Fraction f1(1,3), f2(1,5), f3, f4;f3 f1 - f2;// 分数相减f4 -f1;// 分数取反cout f3;cout f4;return0;}输出结果:0.133333-0.333333重载二元运算符二元运算符 (binary operation).有两个操作数, 通常在运算符的左右两侧 (例如: 32, 58, x*3)重载双目运算符时, 函数中应该有两个参数例子要求:定义字符串类 String, 用来存放不定长的字符串重载关系运算符, 用于两个字符串的比较运算步骤:定义类的 “框架”完善运算符重载String 类:123456789101112131415#ifndef PROJECT4_STRING_H#define PROJECT4_STRING_H#include cstdlibclassString {private:char*p;public:String(){pnullptr;}String(char*str);voiddisplay();};#endif //PROJECT4_STRING_HString.cpp:12345678910111213#include iostream#include cstring#include String.husingnamespacestd;String::String(char*str) {p newchar[sizeof(str)];strcpy(p, str);}voidString::display() {cout p;}main:123456789101112131415#include iostream#include String.husingnamespacestd;intmain() {String s1(Hello);String s2(China);s1.display( );cout ;s2.display( );coutendl;return0;}输出结果:Hello China重载 I/O通过重载输入流 (input stream) 和输出流 (output stream), 我们可以用来输出用户自己定义的数据.