在c ++的operator = function中,我读了很多这样的内容:
ClassA & ClassA::operator=(const ClassA & instance){
if(this == &instance){
return *this;
}
......
......
......
}
“this”是指向当前ClassA实例的指针,“* this”是当前实例的地址。但为什么(这= =&实例)? “& instance”是另一个ClassA实例的地址,“this”只是一个指针。为什么要(这个==&实例)??? 很困惑我,非常感谢任何帮助。而且,实例与实例地址是一样的吗?
答案 0 :(得分:1)
测试this == &instance
测试自我赋值,即操作数是对象本身的情况:
Foo x;
x = x; // or: x.operator=(x)
“问题”是C ++的别名控制非常差,你无法知道或限制任何两个指针或引用是否表示同一个对象。所以你必须测试。
对于一些简单的整数,自我赋值不会是一个大问题,但想象一个基本的,天真的“智能指针”(虽然它不会很聪明):
struct TPtr
{
T * ptr;
TPtr(T * p) : ptr(p) {}
TPtr(TPtr const & rhs) : ptr(new T(*rhs.ptr)) {}
~TPtr() { delete ptr; }
TPtr & operator=(TPtr const & rhs)
{
delete ptr;
ptr = new T(*rhs.ptr); // uh-oh
}
};
你能发现问题吗?
答案 1 :(得分:1)
你是对的,'这个'是一个指针。指针就是地址!所以指针和地址是相同的,我将在下面相同的含义中使用这些术语。 我猜你和&和*因为它们在应用于类型和变量时意味着不同的东西。
ClassA & refVar; //this way you declare a reference
ClassA* pVar; //this way you declare a pointer
refvar; //this is a reference
pVar; // this is a pointer
//To get pointer from the reference you need to get an address.
&refVar; //this is a pointer (an address)
// To get a reference from pointer you need to derefecence it
*pVar; // this is a reference!
所以现在应该清楚为什么'instance'是一个引用,'this'是你的例子中的指针(地址)。为了验证它是否是同一个对象,我们需要获取引用'instance'的地址并将其与指针'this'进行比较。这就是为什么正确的比较是
if(this == &instance) {}
答案 2 :(得分:1)
首先,您必须清楚地知道指针是什么。指针包含指向的数据类型的地址。
在这种情况下,“this”指针指向从ClassA实例化的对象,这意味着“this”等于对象的地址。有一个指针,你在指针前面使用星号(*)访问指向的对象。
因此,“* this”是当前实例,而不是其地址。
(this ==& instance)是指针(当前实例的地址)与“实例”地址之间的相等性比较。
这是为了检查通过(通过引用)传递给函数的参数是否是当前实例本身。这种额外的检查可以避免一些不必要的情况/异常。
实例与实例地址不同。
ClassA myObject; //myObject is an instance
ClassA * ptr; //ptr is a pointer that only points to objects of ClassA
ptr = &myObject; //&myObject is instance address, assign address of myObject to ptr
//in other words, make ptr point to myObject
(*ptr).someFunction(); //use asterisk to access object members
答案 3 :(得分:0)
如果你有一个A类的实例,比如说x
A x;
//Equal operation
x = x;
在这种情况下,您只想再次为自己分配相同的对象,因此您不需要对对象的属性进行所有复制,以避免这些不需要的赋值操作,总是有一个如果条件一开始就检查是否要为自己分配相同的对象,那么你只需要检查地址是否相同。
`(this == &instance)`
这里this
指向x now(即保持对象实例x的地址),当你执行赋值操作(x=x
)时,instance是x对象,& instance是x对象的地址和this
也保存x的地址,因此if条件的计算结果为true,你要做的只是将同一地址再次分配给& x(不需要深度复制对象的属性)