为什么运算符重载指针不允许工作?

时间:2011-05-30 01:47:17

标签: c++ pointers reference language-design

根据this answer下的评论,引用的引用主要是为了支持运算符重载,引用Bjarne Stroustrup:

  

主要介绍参考文献   支持运营商重载。 C   传递每个函数参数   值,以及传递对象的位置   价值低效或   不合适的用户可以通过   指针。这种策略不起作用   使用运算符重载的地方。在   那种情况下,符号方便   必不可少的,以便用户不能   期望插入地址   运算符,如果对象很大。

这意味着运算符重载不能与指针一起使用。但它没有清楚地解释为什么运算符重载指针无法工作。为什么运算符重载不能用于指针?

使用引用的IMO,也可以使用指针。

9 个答案:

答案 0 :(得分:7)

因为如果它被允许,那么它看起来不会很好,并且不会像参考它那样直观。

假设它被允许,那么你会写:

struct A{};
A a, *pa, b;

a = pa ;//doesn't look good, also not intuitive. (not real C++)

它看起来不太好,因为在左侧你有非指针,在右侧你有指针。看起来非常奇怪。此外,由于类型不匹配,因此它的确无关紧要。我的意思是,你要指向非指针的指针;这样的任务应该做什么?将指针所指向的地址内容复制到目标(非指针)并不是很简单。

另一方面,正如其所允许的那样(现实,而不是假设):

a = b; //looks good, intuitive, as now both side is same type

作为参考,你们两方都是相同的类型,只有当b作为参数传递给operator=()时,才会通过引用传递 (或者说通过指针,因为引用是指针的语法糖。)以避免不必要的复制,这反过来又不会妨碍性能,因为如果它会通过值传递

值得注意的是,不仅b通过引用(或下面的指针)传递,a也会被传递通过指针来处理函数,因为我们在函数中知道关键字this实际上是指针

所以引用是在C ++中引入的,它使整个程序对于程序员来说看起来很好而且直观,否则它们就是指针。实际上,大多数编译器在内部使用指针(指针机制)实现引用。

答案 1 :(得分:5)

为什么指针不起作用?因为它含糊不清。将

ostream* operator<<(ostream* s, const char* c);

匹配

cout << 'a';

cout << "a";

此外,您不能使用临时的地址(&)。这应该怎么做:

complex<double> a, b, c;
cout << a + b * c;

因为b * c是临时的,所以总和也是。

答案 2 :(得分:1)

如果为繁重的类重载了加号运算符,则必须编写a + b(按值,低效)或&a + &b(丑陋且复杂)来添加此类的两个对象。但是,即使在撰写a + b时,你也可以通过引用获得参考文献。

答案 3 :(得分:1)

因为大多数运算符在应用于指针时已经具有备用的已知含义。

答案 4 :(得分:1)

运算符重载对象的工作但指针本身不是对象。它指向一个对象。

答案 5 :(得分:1)

考虑声明

c= a+b         

其中+运算符已超载。 编译器可以将此语句解释为

c=operator+ (a, b)

因为这里的变量地址没有传递,所以我们不能在指针变量中收集它们。

如果我们想在指针变量中收集它们,那么我们必须修改语句如下:

c=&a+&b;

但这意味着我们正在尝试添加a和b的地址而不是它们的值。在这种情况下,只能使用引用来节省内存。

答案 6 :(得分:0)

当涉及的两种类型都是内置类型(如intfloat或任何类型的指针)时,操作符不能重载。您可以为一个类和一个基本类型重载运算符(或者您可以只使用类型转换)。例如,您可以添加std::stringconst char *

答案 7 :(得分:0)

  

这意味着该运营商   重载不能用于指针。

这并不意味着这一点。 陈述提供引用是一个必不可少的符号方便,因此程序员不必大量使用address-of运算符。

也是运算符重载不能与指针一起工作的情况,但这基本上是因为它没有语法。为什么?问Stroustrup。

如果在指针之前使用了解引用运算符,则您的IMO是正确的。

答案 8 :(得分:0)

现在是2019年,您仍然无权访问本机类型的类。无法覆盖它们上的运算符。

指针是本机类型(例如char,int,float等)。您可以创建一个行为类似于指针和重载运算符[->,*]的对象,但不会在本机指针上重载[->,*]。例如,您还可以创建一个行为类似于int并重载[+,-,*,/]的对象,但不会在本机int上重载[+,-,*,/]。

出于务实的理性,请想象一下,如果

this->member

具有用户定义的含义。

参考文献是不相关的主题,恕我直言。