这里发生了几件事。
首先,只有一个CTest
被分配的副本。要检查这一点,您可以在构造函数中打印:
class CTest {
public:
CTest() {
cout << "Constructor called";
}
...
};
如果您随后调用您的程序,您会看到构造函数只被调用了一次。
isitme
调用时,将指针与参数this
的地址进行比较cobj
。两者都指向同一个对象,因此它们都包含相同的内存地址。因此,比较通过。
要注意的另一件事是您通过引用传递。如果您没有通过引用传递,那么这将不起作用。例如,如果您有以下代码:
class CTest {
public:
...
bool isitme(CTest cobj) {
return this == &cobj;
}
};
然后对象将按值传递。结果,cobj
制作了副本。实际上,调用另一个构造函数(编译器提供的默认复制构造函数)来创建一个新对象,该对象是给定对象的副本。
为了证明这一点,重写默认的复制构造函数以显示一条消息。
class CTest {
public:
// Default constructor
CTest() {
cout << "Constructor called" << endl;
}
// Copy constructor
CTest(CTest& source) {
cout << "Copy constructor called" << endl;
}
// Comparison
bool isitme(CTest obj) {
return (this == &obj);
}
};
// Main program
int main (int argc, char* argv[]) {
...
CTest a;
CTest* b = &a;
cout << (b->isitme(a)) << endl;
...
}
现在如果你运行程序,你会注意到两个构造函数都被调用了。第一次是在构造函数期间a
。第二次是当您传递a
给该isitme
方法并创建一个副本时。
当按值传递时,isitme
检查将失败,因为它正在比较两个不同对象的指针(内存地址)。