函数/方法如何在内部返回对对象的引用
how function/method returns reference to object works internally
这可能是重复的,但假设我们有以下代码
#include <stdio.h>
#include <stdlib.h>
class IPair{
public:
IPair(const char *s) : s(s){
buffer = malloc(1024);
};
virtual ~IPair(){
free(buffer);
}
virtual void print() const = 0;
const char *s;
void *buffer;
};
class Pair : virtual public IPair{
public:
Pair(const char *s) : IPair(s){};
virtual void print() const override{
printf("Hello %sn", s);
}
};
Pair createPair(const char *s){
return Pair(s);
}
IPair & usePair(IPair &pair){
pair.print();
return pair;
}
int main(int argc, char** argv)
{
Pair a = createPair("AAA");
Pair b = createPair("BBB");
usePair(a);
IPair &x = usePair(b);
usePair(x);
return 0;
}
如果使用valgrind进行检查,则不存在内存泄漏——例如,在正确的"位置"调用了析构函数。
这引发了以下问题:
createPair()
内部究竟发生了什么?看起来对象内存已复制。它是类似memcpy(),还是与复制构造函数有关- usePair()获取引用,然后返回相同的引用。由于引用的对象仍在main()范围内,因此这应该是safe操作-这种假设正确吗
-
与复制构造函数一样,如果没有提供构造函数,编译器将生成一个构造函数,它本质上是
memcpy(*this, rhs, sizeof(*this));
。返回值优化,即编译器传入目标地址以将值存储在中-在大多数情况下不需要副本。[实际上,所有结构/类的返回都会修改调用,以便编译器将要返回的对象作为引用参数进行传递] -
引用与C++中的指针几乎相同,因此当您返回引用时,将返回对象的地址。不同之处在于引用不需要解引用运算符,并且只能分配一次。
- 在create Pair中,将构造一个对象,然后返回。这涉及到复制构造函数(如果Pair实现了Move构造函数,则可以避免)。此外,RVO(返回值优化)可能有助于避免不必要的复制)
- usePair处理引用,此处不会发生复制。完全可以
第页。S.声明IPair虚拟的析构函数。。。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则