这意味着指针无法与操作符重载一起使用。但它没有清楚地解释为什么指针无法与操作符重载一起使用。为什么指针不能进行操作符重载?引用主要是为了支持操作符重载。C通过按值传递每个函数参数,当按值传递对象将会低效或不合适时,用户可以传递一个指针。然而,在使用操作符重载时,这种策略行不通。在这种情况下,符号方便性至关重要,因此如果对象太大,就不能期望用户插入地址运算符。
我认为在使用引用的情况下,也可以使用指针来代替。
这意味着指针无法与操作符重载一起使用。但它没有清楚地解释为什么指针无法与操作符重载一起使用。为什么指针不能进行操作符重载?引用主要是为了支持操作符重载。C通过按值传递每个函数参数,当按值传递对象将会低效或不合适时,用户可以传递一个指针。然而,在使用操作符重载时,这种策略行不通。在这种情况下,符号方便性至关重要,因此如果对象太大,就不能期望用户插入地址运算符。
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++中被引入,使整个过程对程序员看起来更加美观和直观,否则它们在底层是指针。事实上,大多数编译器在内部使用指针机制来实现引用。
ostream* operator<<(ostream* s, const char* c);
匹配
cout << 'a';
或者
cout << "a";
此外,您不能在临时对象上使用取地址符号(&
)。以下代码应该如何处理:
complex<double> a, b, c;
cout << a + b * c;
因为b * c
是临时的,而和也是。
?
cout << 'a';
但是它会匹配 cout << &'a';
,除非编译器抛出左值问题。在这种情况下,您可以使用 char a = 'a'; cout << &a;
。 - Danielcomplex<double> a[4]; cout << a + 1;
会打印出第一个元素加一的和,还是第二个元素呢? - Ben VoigtConsider the statement
c= a+b
其中+运算符已被重载。编译器可以将此语句解释为
c=operator+ (a, b)
由于这里没有传递变量的地址,所以我们无法将它们收集到指针变量中。
如果我们想要将它们收集到指针变量中,那么我们必须修改语句如下:
c=&a+&b;
如果为一个重型类重载加号运算符,你将不得不写 a + b
(按值传递,效率低下)或者 &a + &b
(丑陋而复杂)来添加两个该类的对象。但是使用引用,即使写 a + b
,你也会得到按引用传递。
a+b
比&a+&b1
更直观。 - In silico*
)永久附加在前面的指针。 - Ben Voigt因为大多数运算符在应用于指针时已经有了替代的已知含义。
运算符重载适用于对象,但指针本身不是一个对象。它指向一个对象。
当涉及到内置类型(如int
、float
或任何指针类型)时,无法重载运算符。您可以为一个类和一个原始类型重载运算符(或者您可以使用类型转换)。例如,您可以添加std::string
和const char *
。
int operator+(int, int)
),那么你最终会得到不一致的行为。你的代码将使用你的运算符,而所有其他代码(库)将使用其他(内置)运算符。 - John现在已经是2019年了,但你仍然无法访问本地类型的类。也没有办法覆盖它们上面的运算符。
指针(如char、int、float等)是一种本地类型。你可以创建一个像指针一样行为的对象并重载[->,*]运算符,但这不会重载本地指针上的[->,*]。例如,你还可以创建一个像int一样行为的对象并重载[+,-,*,/],但这不会重载本地int上的[+,-,*,/]。
出于实用和理性的考虑,想象一下如果
this->member
具有用户定义的含义。
参考文献是一个无关的话题,我个人认为。
operator=(A*, A**)
。我认为这与今天的operator=(A&, A*&)
一样罕见。 - Ben Voigt