返回类实例的副本,而不是c++中的指针
return copy of an instance of a class, not a pointer in c++
First;我是否错误地认为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;
}
};
你说得对。this
是指向对象的当前实例的指针(可在成员函数中访问(。
如果你想返回类的副本,有一种简单的方法可以利用按值返回的优势:
someClass returnCopy(){
//Do whatever you want
return *this
}
您只需取消引用this
指针,然后按值返回,这将创建当前实例的副本并返回它。
- c++中的
this
仅是指针。其地址为calling object
所以在你的代码:
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;
}
};
您所需要做的就是:
someClass method(int number) {
_number = number;
return *this;
}
但是要注意,如果您的类中有指针,您通常希望重载复制构造函数。
在复制构造函数中,通常不希望创建指针指向的对象的副本,并将新的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++,我推荐一些好书的帮助,比如《C++入门》。
希望这能有所帮助。
显式复制构造实例:
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);
}
};
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错