这可能是一个noobie问题,但这让我感到困惑,特别是当涉及到这个指针时。 我怎么知道哪个对象"这个"指针指向?我可以提供一个让我困惑的例子...说你有这个代码
#include<iostream>
using namespace std;
class someClass{
int var;
//2 constructors here, one with no arguments, one with giving a value to var(not important)
someClass operator+(someClass object){
someClass rObject;
rObject.var = this->var + object.var //and here is my problem
}
};
int main() {
someClass a(20);
someClass b(30);
someClass c;
c=a+b; //????????
//rest of the code not important
}
在这种情况下,&#34;当前对象&#34;将是对象a,但是如果我们只是切换边以便它是如何有意义的那样&#39; sc = b + a当前对象将成为b ...我很困惑......什么决定当前对象?
答案 0 :(得分:2)
您选择了更为复杂的示例:运营商。通常,更容易推理其他成员函数。考虑:
struct T {
int value;
void foo() { std::cout << this->value << '\n'; }
};
int main() {
T t;
t.foo();
}
你怎么知道foo()
里面的当前对象是哪一个?它是表达式中点运算符左侧的对象,在本例中为t
。 (好吧,在这种情况下,程序中根本没有其他对象!)
现在回到运算符,特别是对于二元运算符,它们中的许多可以以两种形式实现,作为带有两个参数的自由函数或作为带有单个参数的成员函数。在两种情况下,编译器都会为您做直接转换:
struct T {
int value;
T operator+(T const & rhs) { T tmp; tmp.value = this->value + rhs.value; return tmp; }
};
T operator-(T const & lhs, T const & rhs) {
T tmp; tmp.value = lhs.value - rhs.value; return tmp;
}
int main() {
T a, b; a.value = 1; b.value = 2;
a - b;
a + b;
}
然后编译器遇到表达式a - b
它搜索运算符的两种可能形式,它发现它是一个自由函数,它将lhs
绑定到a
和{{ 1}}到rhs
,将表达式转换为b
。在operator-(a, b)
的情况下,编译器再次搜索运算符并将其作为成员函数查找,此时转换变为a + b
并且成员函数内的a.operator+(b)
指针引用一次再次到点运算符左侧的对象。
答案 1 :(得分:1)
非静态类方法具有类类型的隐式第一个参数this
。所以当你写:
operator+(someClass object)
你实际上是这样的:
operator+(someClass* this, someClass object)
现在您可以看到:二元运算符的左侧是第一个参数,右侧是第二个参数(按照惯例,因为它比其他方式更有意义)。
答案 2 :(得分:0)
执行a+b
时,会在对象operator +(someClass)
上调用a
。因此,this
为a
。
答案 3 :(得分:0)
首先考虑一个更简单的operator
,即operator +=
会有所帮助。它似乎是一个更高级的运算符,但那是因为我们使用+学习算术。如果您查看代码,您会发现通常需要三个对象+ c=a+b
,而+ =只需要两个:b += a
。
现在b += a
this
指针应指向您正在更改的对象,即b
。那是第一个对象。为了简单起见,所有二元运算符this
都指向第一个对象。