返回类的实例的副本,而不是c ++中的指针

时间:2013-05-28 15:17:43

标签: c++

首先;我错误地认为this关键字是我正在使用的对象实例的指针,而不是副本?

所以,如果我有:

class someClass {
private:
    int _number;
public:
    someClass method(int number) {
        _number = number;
        return this;
    }
};

我会返回指向该实例的指针吗?

如果是这种情况,我该如何返回该实例的副本?我发现了一种方法,但我觉得它非常尴尬。

class someClass {
private:
    int _number;
public:
    someClass method(int number) {
        _number = number;
        someClass someClassObj;
        someClassObj._number = number;
        return someClassObj;
    }
};

6 个答案:

答案 0 :(得分:1)

你是对的。 this是指向对象当前实例的指针(可在成员函数中访问)。

如果您想要返回班级的副本,有一种简单的方法可以利用按值返回:

someClass returnCopy(){
    //Do whatever you want
    return *this
}

您只需取消引用this指针,然后按值返回,这将生成当前实例的副本并将其返回。

答案 1 :(得分:1)

    c ++中的
  1. this仅指针。其地址为calling object
  2. 所以你的代码:

    class someClass {
    private:
        int _number;
    public:
        someClass method(int number) {
            _number = number;
            return *this;
        }
    };
    

    注意它的*this,所以这显然会返回someclass的对象。

    2.第二个代码段完全有效,并且适用于您的情况:

    class someClass {
    private:
        int _number;
    public:
        someClass method(int number) {
            _number = number;
            someClass someClassObj;
            someClassObj._number = number;
            return someClassObj;
        }
    };
    

答案 2 :(得分:0)

  

this指向我正在使用的对象实例的指针,   不是副本?

是的,它是一个指针。

someClass method(int number) {
        _number = number;
        return *this;
               ^
}

您必须返回*this而不是this。它将返回当前的副本。

someClass method(int number) {
       _number = number;
       someClass someClassObj;
       someClassObj._number = number;
       return someClassObj;
}

此代码有效。

答案 3 :(得分:0)

您需要做的就是:

someClass method(int number) {
    _number = number;
    return *this;
}

但请注意,如果你的班级中有指针,你经常需要重载复制构造函数。

在复制构造函数中,您通常不会创建指针所指向的对象的副本,并将新的someClass对象指针设置为该实例。

答案 4 :(得分:0)

  

首先;我错误地认为this关键字是指针   我正在使用的对象的实例,而不是副本?

你没有错。 this是指向正在执行该方法的对象的指针。但是,在您的代码中存在错误:

someClass *method(int number) {
        _number = number;
        return this;
}

因为你要返回这个,所以编写方法原型的正确方法是声明它返回一个指向类的指针,而不是类的对象。

或许您更愿意返回对象本身。在这种情况下,您必须编写return *this以便从指向实际对象的指针获取。

someClass method(int number) {
        _number = number;
        return *this;
}

但是......惊喜!您没有使用此代码返回此指向的对象,您实际上将返回一个副本。如果您确定要返回this指向的对象,则应返回引用。

someClass &method(int number) {
        _number = number;
        return *this;
}

正如你所看到的,你实际上寻找的并不是那么困难:如果你没有引用的方式返回任何对象,那么你实际上就是在复制它。

  

如何返回该实例的副本?

你这样做的方式完全有效。但是,更常见的情况是让构造函数接受该数字。让我们改变你的代码:

class Int {
private:
    int _number;
public:
    Int(int n): _number( n )
       {}
    int get() const
       { return _number; }
    Int copy() const
    {
        return someClass( get() );
    }
};

在这里你是一个“更真实”的场景,你实际上是在复制对象本身。正如您所看到的,您的问题涉及很多问题(C ++的本质是关于复制所有内容而不是默认使用引用(指针)(例如,Java确实如此))。为了深入了解C ++,我推荐好书的帮助,例如C++ Primer

希望这有帮助。

答案 5 :(得分:-2)

显式复制构造实例:

class someClass {
private:
    int _number;
public:
    someClass(const someClass& that)
    : _number(that._number) { }

    someClass method(int number) {
        _number = number;
        someClass someClassObj;
        someClassObj._number = number;
        return someClass(this);
    }
};