课程咨询 : 020-87532245 24小时热线:15622781509 咨询QQ:3061057839

广州C++培训 > 达内新闻 > 广州C++培训班教你C++运算符重载的概念和语法
  • 广州C++培训班教你C++运算符重载的概念和语法

    发布:广州C++培训      来源:C语言论坛      时间:2016-09-28

  • 所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。

    实际上,广州达内在上几个章节中已经在不知不觉中使用了运算符重载。例如,"+"号可以对不同类型(int、float 等)的数据进行加法操作;"<<"既是位移运算符,又可以配合 cout 向控制台输出数据。C++已经对这些运算符进行了重载。

    C++ 也允许程序员自己重载运算符,这给我们带来了很大的便利。

    下面广州达内C++培训班截取的代码定义了一个复数类,通过运算符重载,用"+"号实现了复数的加法运算:

     #include <iostream>
        using namespace std;
        class complex{
        private:
            double real;  //实部
            double imag;  //虚部
        public:
            complex(): real(0.0), imag(0.0){ }
            complex(double a, double b): real(a), imag(b){ }
            complex operator+(const complex & A)const;
            void display()const;
        };
        //运算符重载
        complex complex::operator+(const complex & A)const{
            complex B;
            B.real = real + A.real;
            B.imag = imag + A.imag;
            return B;
        }
        void complex::display()const{
            cout<<real<<" + "<<imag<<"i"<<endl;
        }
        int main(){
            complex c1(4.3, 5.8);
            complex c2(2.4, 3.7);
            complex c3;
            c3 = c1 + c2;
            c3.display();
          
            return 0;
        }

    运行结果:

    6.7 + 9.5i

    上面的代码定义了一个复数类,real 表示实部,imag 表示虚部,第11行声明了运算符重载,第16行进行了定义。认真观察这两行代码,可以发现和函数重载非常类似。

    运算符重载的方式就是定义一个函数,在函数体内实现想要的功能,当用到该运算符时,编译器会自动调用这个函数。也就是说,运算符重载是通过函数定义实现的,它本质上是函数重载。

    运算符重载的格式为:

    返回值类型 operator 运算符名称 (形参表列){
        //TODO:
    }

    operator 是关键字,专门用于定义重载运算符的函数。例如,要在全局范围内重载"+",实现复数加法运算,可以这样来定义:

    complex operator+(const complex &A, const complex &B){
            complex C;
            C.real = A.real + B.real;
            C.imag = A.imag + B.imag;
            return C;
        }

    细心观察就可以发现,函数名由 operator 和操作符组成,上面的”operator+“就是函数名。重载运算符的函数除了函数名有特定的格式,其他地方和普通函数没有区别。

    上面的例子中,我们在类 Complex 中重载了运算符"+",该重载只对 Complex 对象有效。当执行c3 = c1 + c2;语句时,编译器检测到"+"号左边("+"号具有左结合性)是一个 Complex 对象,就会调用运算符重载函数,该语句会被转换为:

     c1.operator+(c2);

    很明显是一个函数调用。

    上面的运算符重载还可以有更加简练的定义形式:

    complex complex::operator+(const complex & A)const{
            return complex(real+A.real, imag+A.imag);
        }

    return 语句中的complex(real+A.real, imag+A.imag)会创建一个临时对象,它没有对象名,是一个匿名对象。在创建临时对象过程中调用构造函数,return 语句将该临时对象作为函数返回值。

    虽然重载运算符所实现的功能完全可以用函数替代,但运算符重载使得程序的书写更加人性化,易于阅读。运算符被重载后,原有的功能仍然保留,没有丧失或改变。通过运算符重载,扩大了C++已有运算符的功能,使之能用于类对象。

    重载运算符的规则

    C++对运算符重载做了诸多的限制。

    1) 首先,并不是所有的运算符都可以重载。能够重载的运算符包括:

    + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |=

    << >> <<= >>= == != <= >= && || ++ -- , ->* -> () []

    new new[] delete delete[]

    上述操作符中,[] 是下标操作符,() 是函数调用操作符。自增自减操作符的前置和后置形式都可以重载。长度运算符”sizeof“、条件运算符”: ?“、成员选择符”.“、对象选择符”.*“和域解析操作符”::“不能被重载。

    2) 重载不能改变运算符的优先级和结合性。假设上一节的 complex 类中重载了"+"号和"*"号,那么下面代码中:

     int main(){
            complex c1,c2,c3,c4;
            c4 = c1 + c2 * c3;
            return 0;
        }

    c4 = c1 + c2 * c3;语句等同于c4 = c1 + ( c2 * c3 ) ;,乘法的优先级仍然高于加法,而且它们也仍然是二元运算符。

    3) 重载不会改变运算符的用法,例如"+"号总是出现在两个操作数之间,重载后也必须如此。

    4) 重载运算符的函数不能有默认的参数,否则就改变了运算符操作数的个数,这显然是错误的。

    推荐文章

上一篇:广州达内详解C++纯虚函数和抽象类

下一篇:广州达内教你C++用全局函数重载运算符

最新开班日期  |  更多

c++--零基础周末班

c++--零基础周末班

开班日期:2月28日

c++--零基础全日制班

c++--零基础全日制班

开班日期:2月28日

c++--免费训练营

c++--免费训练营

开班日期:2月28日

c++--高薪就业班

c++--高薪就业班

开班日期:2月28日

  • 网址:http://gz.c.tedu.cn     地址:广州市天河北五山路 141 号尚德大厦 627
  • 课程培训电话: 020-87532245 24小时热线:15622781509 咨询QQ:3061057839     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56