【问题标题】:Can not understand a specific fragment of code: Is this a function, just a line or what?无法理解特定的代码片段:这是一个函数,只是一行还是什么?
【发布时间】:2017-05-05 09:36:53
【问题描述】:
Vec2& operator+=(Vec2 const& v);

Vec2 operator+(Vec2 const& u , Vec2 const& v);

我应该为每一行在一个类中创建函数。还有更多,但如果有人可以向我解释他们是关于什么的,我确信我可以自己做剩下的事情。

那么我的想法是什么? Vec2 是我的类的名称,可能意味着这个运算符是这个类的一个对象。但与此同时,这没有任何意义,因为有这个“+=”向我表明这是一条你基本上只是这样做的行:

Vec2& operator = Vec2& operator + Vec2 const& v

但我想这可能是错误的。我的下一个猜测是这是一个应该以 { 插入正文而不是 this 开头的函数;

在我看来,第二个是真正的函数,但为什么运算符后面是加号。这是否意味着这是一种命名函数的特殊方式,而加号实际上没有任何意义?

我希望有人能解释一下这是怎么回事。很抱歉用这样一个具体的问题打扰你:/

【问题讨论】:

  • 你知道那些应该是什么吗??
  • 你知道什么是运算符,重载意味着什么吗?
  • 你可以看看operator-overloading

标签: c++ cmake visual-studio-code


【解决方案1】:

这些是函数声明,你的任务是实现定义。

运算符重载是syntactic sugar,因为它们允许您键入vec_a += vec_b;,而在+= 所在的位置,编译器将其替换为对operator+= 的调用。

Vec2 vec_a;
Vec2 vec_b;
vec_a += vec_b; // the compiler calls vec_a.operator+=(vec_b)

你可以在你的函数中做任何事情,但惯例(和最小意外原则)规定+= 导致vec_b 的内容附加vec_a 的末尾。

Vec2 vec_a;
Vec2 vec_b;
vec_a += vec_b; // vec_a now contains its contents *and* vec_b's contents

你的任务是提供实现这个期望的代码;也就是说,您需要编写代码,以便将表达式右侧的内容(在我的示例中为vec_b附加到表达式左侧内容的末尾表达式(在我的示例中为vec_a)。

例如,假设Vec2 具有以下数据成员:

int* data;      // a pointer to array of ints, "capacity" long
int  capacity;  // the length of the array of ints
int  size;      // the number of ints stored in data

然后您将提供如下定义:

Vec2& Vec2::operator+=(Vec2 const& v)
{
    int required_capacity = size + v.size;
    if (required_capacity > capacity)
    {
        // create a temp array required_capacity long
        // copy contents of data into temp array
        // assign data so it points to temp
        // assign capacity to required_capacity
    }
    // copy v.size elements from v.data to data[size]
    // increment size by v.size
    return *this;
}

我留给你的实际实现作为练习

【讨论】:

    【解决方案2】:

    这些确实是类Vec2 的函数声明,用于声明此类可能的运算符(称为运算符重载)。如果你定义它们,你可以在你的类上使用++= 运算符,就像使用内置类型一样。

    Vec2 a, b; // initialize somehow
    Vec2 x = a + b;
    x += b;
    

    您基本上可以重载几乎所有运算符。有关更多信息,请参阅: http://en.cppreference.com/w/cpp/language/operators

    【讨论】:

      【解决方案3】:

      这是一个运算符的函数定义。 C++ 不知道您的类型,如果您想对它们使用数学运算符,它也不知道如何处理您的提示。

      这一行:

      Vec2 operator+(Vec2 const& u , Vec2 const& v);
      

      声明对于您的“Vec2”类型,有一个数学“+”,因此您可以使用

       Vec2 v = yourVector + yourVector2
      

      没有错误。 另外,请看here

      【讨论】:

      • u 是第一个参数的名称(数学方程的左侧),v 是数学方程的右侧。
      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多