你怎么知道当前对象是什么?

How do you know what is the current object?

这可能是一个菜鸟问题,但这让我感到困惑,尤其是在涉及到 this 指针时。 我怎么知道 "this" 指针指向哪个对象?我可以提供一个让我感到困惑的例子......假设你有这段代码

#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

}

在这种情况下,"current object" 将是对象 a,但是如果我们只是切换边,那么它是 c=b+a,那么当前对象将变为 b,这有什么意义...我很困惑... 什么决定了当前对象?

非静态 class 方法具有 class 类型的隐式第一个参数 this。所以当你写:

operator+(someClass object)

你实际上得到了这个:

operator+(someClass* this, someClass object)

现在您可以看到:二元运算符的左侧是第一个参数,右侧是第二个参数(按照惯例,因为它比反过来更有意义).

当您执行 a+b 时,会在对象 a 上调用 operator +(someClass)。因此,thisa.

您选择了更复杂的示例:运算符。一般来说,推理其他成员函数更容易。考虑:

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 绑定到 arhsb,将表达式转换为 operator-(a, b)。在a + b的情况下,编译器再次查找运算符,发现它是一个成员函数,此时转换为a.operator+(b),成员函数内部的this指针引用一次再次指向点运算符左侧的对象。

首先考虑一个更简单的 operator,即 operator +=。它可能看起来是一个更高级的运算符,但那是因为我们使用 + 学习了算术。如果查看代码,您会发现 + c=a+b 通常需要三个对象,而 += 只需要两个对象:b += a.

现在 b += a 中的 this 指针应该指向您要更改的对象,即 b。这是第一个对象。为了简单起见,对于所有二元运算符 this 指向第一个对象。