根据this answer下的评论,引用的引用主要是为了支持运算符重载,引用Bjarne Stroustrup:
主要介绍参考文献 支持运营商重载。 C 传递每个函数参数 值,以及传递对象的位置 价值低效或 不合适的用户可以通过 指针。这种策略不起作用 使用运算符重载的地方。在 那种情况下,符号方便 必不可少的,以便用户不能 期望插入地址 运算符,如果对象很大。
这意味着运算符重载不能与指针一起使用。但它没有清楚地解释为什么运算符重载指针无法工作。为什么运算符重载不能用于指针?
使用引用的IMO,也可以使用指针。
答案 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)
当涉及的两种类型都是内置类型(如int
,float
或任何类型的指针)时,操作符不能重载。您可以为一个类和一个基本类型重载运算符(或者您可以只使用类型转换)。例如,您可以添加std::string
和const char *
。
答案 7 :(得分:0)
这意味着该运营商 重载不能用于指针。
这并不意味着这一点。 陈述提供引用是一个必不可少的符号方便,因此程序员不必大量使用address-of运算符。
也是运算符重载不能与指针一起工作的情况,但这基本上是因为它没有语法。为什么?问Stroustrup。
如果在指针之前使用了解引用运算符,则您的IMO是正确的。
答案 8 :(得分:0)
现在是2019年,您仍然无权访问本机类型的类。无法覆盖它们上的运算符。
指针是本机类型(例如char,int,float等)。您可以创建一个行为类似于指针和重载运算符[->,*]的对象,但不会在本机指针上重载[->,*]。例如,您还可以创建一个行为类似于int并重载[+,-,*,/]的对象,但不会在本机int上重载[+,-,*,/]。
出于务实的理性,请想象一下,如果
this->member
具有用户定义的含义。
参考文献是不相关的主题,恕我直言。