C++ 返回类实例的副本,而不是c++;

C++ 返回类实例的副本,而不是c++;,c++,C++,第一,;我是否错误地认为this关键字是指向我正在处理的对象实例的指针,而不是副本 如果我有: class someClass { private: int _number; public: someClass method(int number) { _number = number; return this; } }; 我将返回指向该实例的指针 如果是这样,我如何返回该实例的副本?我找到了一个方法,但我觉得这非常尴尬 class so

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

你说得对<代码>此是指向对象当前实例的指针(可在成员函数中访问)

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

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

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

您只需执行以下操作:

someClass method(int number) {
    _number = number;
    return *this;
}
但是要注意,如果类中有指针,则通常希望重载复制构造函数


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

显式复制构造实例:

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);
    }
};
第一,;我是否错误地认为
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++,我推荐好的书的帮助,比如.< /P> 希望这有帮助

<>代码> C++中的仅为指针,其地址为“代码>调用对象< /代码> .< 因此,在您的代码中:

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;
    }
};

返回*此
?使用
*此
返回类的副本。如果您尝试在代码预期不应编译的值时返回此。考虑到负面投票分数,我认为我的解决方案存在缺陷,但我没有立即看到?好吧,这样做没有意义。编译器合成的复制构造函数就可以了。只需
返回*这个