c ++ this,* this,& instance in operator = function让我非常困惑

时间:2014-02-05 04:50:35

标签: c++

在c ++的operator = function中,我读了很多这样的内容:

ClassA & ClassA::operator=(const ClassA & instance){
    if(this == &instance){
        return *this;
    }
    ......
    ......
    ......
}

“this”是指向当前ClassA实例的指针,“* this”是当前实例的地址。但为什么(这= =&实例)? “& instance”是另一个ClassA实例的地址,“this”只是一个指针。为什么要(这个==&实例)??? 很困惑我,非常感谢任何帮助。而且,实例与实例地址是一样的吗?

4 个答案:

答案 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(不需要深度复制对象的属性)