-1

第一的; 我是否错误地认为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;
    }
};
4

5 回答 5

1
  1. this在 c++ 中只是指针。它的地址为calling object.

所以在你的代码中:

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

注意它*this,所以这明显返回了某个类的对象。

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

class someClass {
private:
    int _number;
public:
    someClass method(int number) {
        _number = number;
        someClass someClassObj;
        someClassObj._number = number;
        return someClassObj;
    }
};
于 2013-05-28T16:11:51.213 回答
1

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

如果你想返回你的类的副本,有一种简单的方法可以利用按值返回:

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

您只需取消引用this指针并按值返回,这将复制您当前实例并返回它。

于 2013-05-28T15:20:08.337 回答
0

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

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

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

由于您要返回它,因此编写方法原型的正确方法是声明它返回指向类的指针,而不是指向类的对象。

或者,也许您更喜欢返回对象本身。在这种情况下,您必须编写return *this才能从指针中获取指向的实际对象。

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

但是……惊喜!您不会使用此代码返回 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

希望这可以帮助。

于 2013-05-28T15:31:01.887 回答
0

您需要做的就是:

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

但请注意,如果您的类中有指针,您通常希望重载复制构造函数。

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

于 2013-05-28T15:21:39.067 回答
-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);
    }
};
于 2013-05-28T15:22:50.800 回答