Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';不要让';过载';C+中的运算符+;?_C++_Operator Overloading - Fatal编程技术网

C++ 为什么可以';不要让';过载';C+中的运算符+;?

C++ 为什么可以';不要让';过载';C+中的运算符+;?,c++,operator-overloading,C++,Operator Overloading,这将是非常有用的,能够超载。C++中的运算符,返回对对象的引用。< /P> 您可以重载运算符->和运算符*,但不能重载运算符。 这有技术原因吗?Stroustrup: 接线员。(dot)原则上可以是 使用与相同的技术重载 用于->。然而,这样做可能会造成严重后果 引出关于 操作是针对对象的 超载。或提及的对象 通过例如: class Y { public: void f(); // ... }; class X { // assume that you can overloa

这将是非常有用的,能够超载。C++中的运算符,返回对对象的引用。< /P> 您可以重载
运算符->
运算符*
,但不能重载
运算符。

这有技术原因吗?

Stroustrup:

接线员。(dot)原则上可以是 使用与相同的技术重载 用于->。然而,这样做可能会造成严重后果 引出关于 操作是针对对象的 超载。或提及的对象 通过例如:

class Y {
public:
    void f();
    // ...
};
class X {   // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};
void g(X& x)
{
    x.f();  // X::f or Y::f or error?
}
class Y {
public:
    void f();
    // ...
};

class X {    // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};

void g(X& x)
{
    x.f();    // X::f or Y::f or error?
}
这个问题可以通过几个步骤来解决 方式。在标准化的时候,, 不清楚哪条路是正确的 最好的。有关更多详细信息,请参阅

见:

接线员。(dot)原则上可以使用相同的 用于->的技术。然而,这样做可能会引发问题 关于操作是否用于对象重载。或 所引用的对象。例如:

class Y {
public:
    void f();
    // ...
};
class X {   // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};
void g(X& x)
{
    x.f();  // X::f or Y::f or error?
}
class Y {
public:
    void f();
    // ...
};

class X {    // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};

void g(X& x)
{
    x.f();    // X::f or Y::f or error?
}
这个问题可以用几种方法解决。在 在标准化方面,哪种方式最好并不明显。更多 详情请参阅


<> Stroustrup表示C++应该是一种可扩展的语言,而不是可变语言。 点(属性访问)操作符被认为太接近语言的核心,不允许重载

参见第242页第11.5.2节智能参考

当我决定允许操作符
->
重载时,我自然而然地考虑了操作符
是否可以同样重载

当时,我认为以下论点是决定性的:如果
obj
是一个类对象,那么
obj.m
对该对象类的每个成员
m
都有意义。我们试图通过重新定义内置操作来避免语言的易变性(尽管出于迫切的需要,
=
和一元
&
违反了这一规则)

如果我们允许类
X
重载,我们将无法通过正常方式访问
X
的成员;我们必须使用指针和
->
,但是
->
&
也可能被重新定义。我想要一种可扩展的语言,而不是可变的语言

这些论点很有分量,但不是决定性的。特别是,在1990年,Jim Adcock建议允许运算符
重载,这正是运算符
->
的方式

这句话中的“我”是比亚恩·斯特劳斯特鲁普。你再权威不过了


<>如果你想真正理解C++(就像在“为什么是这样”),你应该完全读这本书。

如果你通过操作函数调用的内部机制,它是很容易理解的。 假设一个类复形可以有两个成员r表示实部,i表示虚部。 假设复杂C1(10,20),C2(10,2)//我们假设类中已经有一个双参数构造函数。 现在,如果您将C1+C2写为一条语句,那么编译器将尝试在复数上查找重载版本的+运算符。现在我们假设I重载+运算符 C1+C2内部翻译为C1。运算符+(C2) 现在假设您可以重载“.”运算符。 所以现在考虑下面的调用C1.disp()//显示复杂对象的内容,现在尝试将其表示为内部表示
C1.运算符。(------),创建了完全混乱的东西。这就是为什么我们不能重载“.”运算符的原因。

您能举一个例子说明您何时要覆盖“.”运算符吗?通常,用例是“智能引用”。一种代理。@Gamecat:通读添加重载
运算符的能力的建议。
运算符。*
,它有几个例子。@Toonkrij允许
周围的空格,所以可能是一些聪明但骇人听闻的动态调度黑客,允许将点积表示为
矩阵1。matrix2
。在我的回答中引用了TDaEoC++的全部内容。我很想以剽窃/重新剽窃为由否决这一点。引用时,逐字引用,不要调整。并使用引号格式。该示例只是重载解析歧义,指出需要更仔细的编程(请参阅:)这种情况不应成为不重载
运算符的理由。
@slashmais否。运算符的对齐方式。与
运算符->
是明确的平行关系。那你怎么能做到重载解析呢?只是要注意,后来,比亚恩·斯特劳斯特鲁普支持运算符点,甚至提出了一个建议,但显然不是(现在)接受了:正如已经被@ EMLAI添加到评论的评论中,我评论Anton的回答有些人说内部翻译不应该调用过载<代码>操作符。< /代码>见一个C++提案,这是如何有用的而不是这么混乱的: