【问题标题】:Overloading (),[] operators in c++ [closed]C ++中的重载(),[]运算符[关闭]
【发布时间】:2011-09-09 03:13:07
【问题描述】:

如何在 c++ 中重载 () 和 [] 运算符?用一些代码证明。 不会影响编程语言的完整性吗?

【问题讨论】:

  • 使用哪种语言? OOP 和 C++ 不是同义词。
  • -1 对于“你会如何...举一些例子。”这个问题有很好的潜力(例如最后一点和“陷阱”),但事实并非如此。一个教程——不是这样——是你首先需要的。
  • @vivek - 查看右侧的相关问题。我相信你能找到一些。
  • 我强烈建议不要在除了小的个人代码实验之外的任何东西中重载 '()' 运算符。它很容易与构造函数语法混淆,使使用它的代码难以维护/调试。
  • @Darcy :不要失礼,但你不能再错了。 operator() 是函数对象(又名函子)的基础,它与迭代器一起是与 C++ 标准库本身交互的基础。在现代 C++ 代码中,operator() 是用户代码中应该重载的运算符(operator= 除外)。

标签: c++ oop overloading operator-keyword


【解决方案1】:

它不会仅仅因为只能对用户定义的类型执行运算符重载而影响编程语言的完整性。在 C++ 中为内置类型重载运算符是不可能的。您不能使用数据指针(也包括数组)更改 [] 的行为。您不能使用函数指针更改 () 的行为。换句话说,不能重载 C++ 的核心语言特性。

【讨论】:

    【解决方案2】:

    这是一个例子:

    class Test {
      const int size = 128;
      int data[size];
    public:
      Test() { 
        // allocate memory for data, etc.
      }
    
      int& operator[](int index) {
        return data[index];
      }
    };
    

    【讨论】:

    • 如果有一个对象数组怎么办?不会影响原生的 [] 操作吗?
    • 除非您从定义了 operator[] 的类继承,否则没有原生 [] 运算符。如果你
    • 只有在子类化定义了 [] 的东西时才会出现问题。例如。标准::向量。在这种情况下,您可能不想更改 [] 的默认行为。仅仅因为 C++ 允许你做很多事情,并不意味着你应该这样做:)
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多