为什么不允许指针的运算符重载工作?
Why isn't operator overloading for pointers allowed to work?
根据这个答案下的注释,引入引用主要是为了支持引用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的地址,而不是它们的值。在这种情况下,只能使用引用来节省内存。
当涉及的两种类型都是内置类型(如int
、float
或任何类型的指针)时,不能重载运算符。您可以为一个类和一个基元类型重载运算符(也可以只使用类型转换)。例如,可以添加std::string
和const char *
。
这意味着操作员重载不能与指针一起使用。
这一点也不意味着。它声明提供引用是一种基本的符号便利,这样程序员就不必随意使用运算符的地址。
也是运算符重载不适用于指针的情况,但这基本上是因为没有语法。为什么?问问斯特劳斯特鲁普。
如果在指针之前使用了解引用运算符,则IMO是正确的。
现在是2019年,您仍然无法访问本地类型的类。无法覆盖它们上的运算符。
指针是(如char、int、float等)本机类型。您可以创建一个行为类似指针的对象,并重载运算符[->,*],但不会在本机指针上重载[->,**]。例如,您还可以创建一个行为类似int的对象并重载[+,-,*,/],但不会在本机int上重载[+、-、*、/]。
为了务实理性,想象一下的混乱
this->member
具有用户定义的含义。
参考文献是一个无关的话题,IMHO。
- C++编程:运算符重载中的引用如何工作?
- C++,()运算符重载,它的工作是什么
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- 如何使'='重载在'='的另一边工作
- C++ 继承:基类中重载 operator+ 的 2 次在派生类中无法正常工作
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- 当传递NULL作为参数时,函数重载是如何工作的
- c++ 中的函数重载如何在没有钻石继承的情况下工作?
- 工作函数重载如何使用可变参数解析?
- 重载按位 OR('|'),用于链接操作无法按预期工作
- 此模板类型推断和重载解析如何工作
- 当其中一个函数未编译时,函数重载查找如何工作?
- 运算符重载在 CPP 中的排序中如何工作?
- 我的重载后增量方法无法按预期工作。为什么?
- 运算符重载如何工作,为什么在我的情况下不起作用?
- 运算符重载 =, *=.如何使这项工作
- 在存在新的初始值设定项序列的情况下,运算符重载解析如何工作
- 重载输入/输出运算符,为什么它以这种方式工作而不是以另一种方式工作
- C++ 重载 ->运算符,它是如何工作的?
- 为什么不允许指针的运算符重载工作?