你怎么知道当前对象是什么
How do you know what is the current object?
一个菜鸟问题,但这让我感到困惑,尤其是当涉及到这个指针时。我怎么知道"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
绑定到a
,rhs
绑定到b
,将表达式转换为operator-(a, b)
。 在 a + b
的情况下,编译器再次搜索运算符并将其定位为成员函数,此时转换变得a.operator+(b)
,成员函数内的this
指针再次指向点运算符左侧的对象。
非静态类方法具有类类型的隐式第一个参数this
。 所以当你写:
operator+(someClass object)
你实际上得到了这个:
operator+(someClass* this, someClass object)
现在你可以看到:二进制运算符的左侧是第一个参数,右侧是第二个参数(按照惯例,因为它比相反更有意义)。
当你执行a+b
时,它会在对象a
上调用operator +(someClass)
。 因此,this
a
.
首先考虑一个更简单operator
,即operator +=
。它可能看起来是一个更高级的运算符,但那是因为我们使用 + 学习了算术。如果你看一下你的代码,你会发现你通常需要三个对象来表示 + c=a+b
而 += 只需要两个:b += a
。
现在b += a
this
指针应该指向您正在更改的对象,即 b
.这是第一个对象。为了简单起见,对于所有二元运算符,this
指向第一个对象。
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 是什么让放置新调用对象的构造函数?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 为对象分配整数.输出将是什么?
- 在C++中,创建'n'数量的对象的推荐方法是什么,其中n是用户定义的。我该怎么做?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 处理从列表中删除指向对象的指针的"healthy"方法是什么?
- 在C++中返回 IO 对象的目的是什么?
- 在C++中有多个指向单个对象的指针的正确方法是什么?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 使用对函数和IO对象的引用(作为参数)的目的是什么
- 这些情况有什么区别?我怎么知道什么是临时对象?
- 在多个对象中初始化预定义成员变量的正确方法是什么?
- 在 c++ 中重置大型对象实例的最佳方法是什么
- 将对象传递给模板构造函数或方法的正确方法是什么
- 面向对象概念的例子车,这里应该是什么对象