解释c++中的操作符重载

Explain operator overloading in C++

本文关键字:操作符 重载 c++ 解释      更新时间:2023-10-16
class Vector { 
      public: 
       Vector(int s) :elem{new double[s]}, sz{s} { }
       double& operator[](int i) { return elem[i]; } //function 2
       int size() { return sz; } 
        private: 
            double∗ elem;  
            int sz; 
     };

代码片段来自: c++编程语言第4版, Bjarne Stroustrup
IDE: Microsoft Visual Studio Professional 2013

请解释operator关键字有什么作用?我试着搜索,找不到任何其他除了操作符重载,这不是我的问题

double read_and_sum(int s) { 
                    Vector v(s);                     //line 1
                    for (int i=0; i!=v.size(); ++i) 
                    cin>>v[i];                        //line 3
                    double sum = 0; 
                    for (int i=0; i!=v.size(); ++i) 
                    sum+=v[i];
                     return sum;
                    }

line1传递了vector类的构造函数所需的int型实参s,这很好。

但是在第3行,"cin>>v[i]"怎么可能是有效的呢?,因为对象v没有声明为对象数组。即使它是有效的值去哪里…?

看来你是c++新手。下面关于操作符重载的链接可能会有用。

操作符重载基础:operator重载。

可以重载的操作符的完整列表:

I tried searching on internet, couldn't find anything else apart from operator overloading, which is not my question.


实际上,你的问题似乎是关于操作符重载的,你只是不知道而已。

operator关键字在类声明中用于重载操作符。在您所展示的示例中,该类重载了数组索引操作符[]。这就是允许语法cin>>v[i](问题的第二部分)工作的原因。因为[]操作符是重载的,所以可以用这种方式引用类对象——当进行这样的引用时,编译器生成代码来调用重载的定义。重载定义告诉它如何在给定数组索引的情况下获得正确的对象。这让你的类表现得像一个数组,即使它实际上不是一个。

操作符重载经常被误解和误用,但如果使用得当,它是c++中唯一强大的特性。

我不能回答关于Visual Studio中关键字着色的部分——听起来这只是微软编辑器的一个特性。但operator在c++中绝对是一个关键字,无论IDE如何显示它。