【问题标题】:Explain operator overloading in C++解释 C++ 中的运算符重载
【发布时间】:2014-05-06 20:18:25
【问题描述】:
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; 
     };

代码 sn-p 来自: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++


【解决方案1】:

看来您是 C++ 新手。以下有关运算符重载的链接可能很有用。

运算符重载的基础知识:Operator Overloading

可重载运算符的完整列表:Operator Overloading

【讨论】:

    【解决方案2】:

    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 中关键字着色的部分 - 听起来这只是 Microsoft 编辑器的一个特性。但是operator绝对是C++中的关键字,不管IDE如何显示。

    【讨论】:

    • 所以 cin>>v[i] 将值赋予 elem ,它指向双精度数组? ,例如,如果我在存储值之后,我想访问它们,我只会写 cout
    • 正确重载的 [] 运算符应该允许您编写将对象视为数组的代码。所以是的,你应该能够写出 x = v[i]、v[i] = n 或 v[i] = v[j] 之类的东西。
    • Bjarne Stroustrup 的书不是学习 C++ 的好地方。这是一本很好的参考书,但还有更好的书可供学习。这里有很多 C++ 书籍推荐的链接:stackoverflow.com/questions/388242/…
    • 非常感谢@Jeff Loughlin,加速 c++ 似乎适合我,冒着投机取巧的风险,我想知道这里的不同徽章和代表分数,我刚收到了一位学者徽章。 :)
    • 单击页面顶部的徽章按钮,或转到此处:stackoverflow.com/help/badges。然后阅读常见问题解答。欢迎使用 Stack Overflow。
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多