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

Why isn't operator overloading for pointers allowed to work?

本文关键字:重载 工作 运算符 不允许 指针 为什么      更新时间:2023-10-16

根据这个答案下的注释,引入引用主要是为了支持引用Bjarne Stroustrup:的运算符重载

主要介绍了参考文献以支持操作员过载。C通过值,以及传递对象的位置价值将是低效的,或者用户可以传递指针。这个策略不起作用其中使用运算符重载。在里面在这种情况下,符号的便利性是至关重要,因此用户不能应插入的地址−运算符(如果对象很大)。

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

在使用引用的IMO中,指针也可以在其位置使用。

因为如果允许,那么它看起来就不好,也不会像它的参考那样直观。

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

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也由pointer传递给函数,因为我们知道在函数中,关键字this实际上是指标器

因此,引用是在C++中引入的,目的是让整个事情对程序员来说看起来既好又直观,否则它们就是指针。事实上,大多数编译器在内部使用指针(指针机制)来实现引用。

为什么它不适用于指针?因为这是模棱两可的。

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

匹配

cout << 'a';

cout << "a";

此外,您不能将(&)的地址与临时地址一起使用。这应该做什么:

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

由于b * c是临时的,并且总和也是。

对于重载类重载加号运算符,您必须编写a + b(按值计算,效率低下)或&a + &b(丑陋而复杂)来添加此类的两个对象。但有了参考文献,即使在写a + b时,你也会通过参考文献获得。

因为大多数运算符在应用于指针时已经有了另一种既定的含义。

运算符重载处理对象,但指针本身不是对象。它指向一个对象。

考虑语句

c= a+b         

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

c=operator+ (a, b)

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

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

c=&a+&b;

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

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

这意味着操作员重载不能与指针一起使用。

这一点也不意味着。它声明提供引用是一种基本的符号便利,这样程序员就不必随意使用运算符的地址。

也是运算符重载不适用于指针的情况,但这基本上是因为没有语法。为什么?问问斯特劳斯特鲁普。

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

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

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

为了务实理性,想象一下的混乱

this->member

具有用户定义的含义。

参考文献是一个无关的话题,IMHO。