English 中文(简体)
如何超载接线员+?
原标题:How to overload the operator +?

有人能用 < strong> beginner 术语解释超载操作员是如何工作的吗? 我需要将“ +” 操作员作为成员功能超载, 将它连接到对象阵列中。 我读过谷歌中的一些东西, 它的操作方式和“ +” 一样, 没有超载, 所以我非常困惑 。

这是我至今为止为宣言准备的:

ALIST<t_type> & operator+(const t_type );

因此,我在公共部分的ALIST课中宣布了这一点。 “+”操作员现在是否超载了,或者我还需要在这个功能定义中做更多的工作才能让它超载?

而且,一旦它最终超载,我现在能做些什么呢?超载有什么意义呢?

请以初学者术语解释 谢谢

最佳回答

举例来说,这就是为什么。

Say you are implementing a class of special vectors. For instance a Color class. Colors are going to basically be vectors with 4 values, r,g,b,a.

现在我们正在写一个图形引擎,在我们的程序中,我们经常会想知道当两个不同来源的灯光对正在蒸发的像素作用时,像素会怎么样(就像在射线追踪器中那样 ) 。 定义一个 + 操作员来对两个不同来源的光被加在一起时会发生什么。

如果我们没有操作员, 您可以在您的代码中写入两个 < code> Color :

Color newColor = Color(
    color1.r + color2.r, 
    color1.g + color2.g,
    color1.b + color2.b,
    color1.a + color2.a
);

更糟糕的是,如果你与光的物理学密切合作,你可能会发现颜色不会正常增加。例如,它们可能根据某些线性函数添加,例如 f(a) = a% 2...(光不这样做,我认为它只是一个随机的例子)。

f(a) = a^2; f(b) = b^2
f(a + b) = ??
a = f(a)^.5; b = f(b)^.5
a + b = f(a)^.5 + f(b)^.5
f(a + b) = (f(a)^.5 + f(b)^.5)^2 *yada yada yada i m terrible at math.

这意味着我们的 Color 添加代码后成为

Color newColor = Color(
    pow(pow(color1.r, .5) + pow(color2.r, .5),2), 
    pow(pow(color1.g, .5) + pow(color2.g, .5),2),
    pow(pow(color1.b, .5) + pow(color2.b, .5),2),
    pow(pow(color1.a, .5) + pow(color2.a, .5),2), 
);

A pain to write out. But of course, If we take the Color class, and overwrite the add operator to do all of this for us, in our code we can just write

Color color = color1 + color2;

此定义在 Color 类定义中定义

Color Color::operator+(const Color &rhs) const {
     return Color(
           pow(pow(this.r, .5) + pow(rhs.r, .5),2), 
           pow(pow(this.g, .5) + pow(rhs.g, .5),2),
           pow(pow(this.b, .5) + pow(rhs.b, .5),2),
           pow(pow(this.a, .5) + pow(rhs.a, .5),2)
     ); 
}

因为我们的特殊添加代码 只有一个地方, 你可以优化它更好, 和代码 在你的方案的其他部分 变得更容易读取。

一种至少看它的方式。 过去, 我比较喜欢 < code> addLights (color1, color2) 等函数, 因为它容易编码, 很容易读, 更易读, 因为它显然不是传统的 < code> victor 添加。 我敢打赌, 你的整个职业生涯不会超越操作员, 我不认为你会错过很多。

问题回答

如果您有自定义类, 并且想要能够“ 添加” 两例该类, 操作员+超载将允许您自定义两个对象“ 添加” 的组合 。

您现在需要在. h 或. cpp 文件中执行操作员+ 方法 。

到目前为止,你得到了一个正确的声明,然后你将需要执行它,即通过将输入参数添加到内部管理的阵列中来填充身体。

当您在位时, 您将能够说 < code> mylist = my list+ mytype; 而不是 < code> mylist.add( mytype) . ablic. addd( mytype) ablic. 在这样的情况下没有什么大不了的, 但如果您正在开发自然会与数学矩阵、 矢量、 复数等等标准操作员合作的班级, 或者您在您的 < code > ALIST 类中推翻 < code > 运算符, < < < < /code > a运算 > 操作员, 这更有意义 。

如前所述,必须有一个执行程序。仅仅以超载为原型,无法让编译者为您写入操作 。

如果您是初学者 (或至少是, 以 < enger > " beginner terms" > > 寻求答案, 操作员超载并不一定是跳跃用于重要项目的最佳主意。 涉及到一些语义问题... 因为 < code\\ / code > 是一个非常抽象的符号, 对阅读您的代码的人来说可能意味着很多不同的东西, 而描述性更强的名称可能更好 。

请注意,即使标准图书馆也不会通过 < code/ code> 向量附加, 因为它们存储可以一起添加的元素... 或向量附加..., 或者在结尾添加一个元素... 添加 nauseum [pun 想要] 。 将“ add” 定义称为“ add” 最“ right” 很难 :

< a href=" "https://stackoverflow.com/ questions/636231/ why -not-overload-operator- for-stdvector" '为什么不超载运算器\\\ () 对于 std:::vector?

(注意,由于 std::string 不存储任意数学类型, 它的模糊性较小 。)

也可以很难查找这些操作员方法被调用的位置, 因为没有您要搜索的方法的独特名称 。 要查找您需要通过算术和字符串类背景中使用的< code_ / code> 来筛选的电话 。

除了命名问题之外, 我还会提到, 操作员在超载时将您的双手绑在一起, 如果您想要稍后通过额外的参数。 如果您每次在列表中插入某个内容时想要扩展一个优先参数吗? 有各种技巧可以绕过它, 比如将超载维持为默认执行以及使用参数化方法 。 或者您可以做为 < code\\ lt; iomanip> 所采纳的流 :

http://www.cplusplus.com/reference/iosl/ioslive/manipulators/"rel="不跟随 nofollow noreferrerr" >http://www.cplus.com/reference/ioslive/manipulators/ http://www.cplusplus.com/reference/ioslive/manipulators/

但它只是指出,在潜入操作员超载的操作员之前,应该谨慎行事。另一个需要注意的微妙之处是使用班级的全球“朋友”功能超载,还是使用成员超载,两者之间的区别。这里讨论的是...

< a href=" "https://stackoverflow.com/ questions/462230/operator-overloading- member- opident- opident- opident- opident- opident- opident- opident- opident- opident- opident- vs- unmember- opident- opident- opident " > : 成员函数相对于非成员函数?

一个重要的要点是,如果你想让非类(如整数)出现在操作的 left 手边的情况具有意义, 则无法为 < code>int 添加方法。 因此, 您必须将其变成全球超载 。

默认情况下,运算符符号设计为与内置类型(内型、字符、字符串等)一起工作。

C++ 的创建者无法定义 剧本应该如何为用户定义的类型工作, 所以他实施了一个系统, 你可以让剧本超载, 并且用与该对象相关的合理方式定义自己的行为 。

你一般都超载 这样的操作员:

在课中。 h

class MyClass {
    int a;
    MyClass(int value) : a(value) {}
    MyClass MyClass::operator+(const MyClass&) const;
}

在类中。 cpp

MyClass MyClass::operator+(const MyClass& other) const
{
    return MyClass(this->a+other.a);
}

返回新的 MyClass ,该变量的变量将集合到 MyClass 两种数值的值。一旦完成这项工作,您可以这样做:

MyClass first(2);
MyClass second(5);
MyClass last = first + second;
std::cout << last.a << std::endl; // prints 7, which is the result of 2+5

MyClass 上不超载 operator@/code>, 添加两个 MyClass s 组合将无效 。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?