这可能是一个菜鸟问题,但这让我很困惑,尤其是当涉及到这个指针时。 我怎么知道“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
}
在这种情况下,“当前对象”将是对象 a,但是如果我们只是换边,那么它有什么意义呢 c=b+a 当前对象将变成 b...我很困惑...什么决定了当前对象?
最佳答案
您选择了更复杂的示例:运算符。一般来说,推理其他成员函数更容易。考虑:
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
绑定(bind)到a
和 rhs
到 b
,将表达式转换为 operator-(a, b)
。对于a + b
,编译器再次搜索operator,发现它是一个成员函数,此时转换为a.operator+(b)
并且成员函数中的 this
指针再次指向点运算符左侧的对象。
关于c++ - 你怎么知道当前对象是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27811054/