在C++到第一个对象中创建第二个对象时,第一个对象会去哪里?
When creating a second object in C++ through the first object, where does the first object go?
我目前正在阅读赫伯特·希尔特(Herbert Schildt(的《C++:初学者指南》第二版。
在模块 9.4 中,他谈到了返回对象:
正如对象可以传递给函数一样,函数也可以返回对象。要返回对象,请先声明 作为返回类类型的函数。其次,使用正常返回返回该类型的对象 陈述。以下程序有一个名为 mkBigger( ( 的成员函数。它返回一个对象 为 val 提供一个比调用对象大两倍的值。
这是他提到的"以下程序":
// Returning objects.
#include <iostream>
using namespace std;
class MyClass {
int val;
public:
// Normal Constructor.
MyClass(int i) {
val = i;
cout << "Inside constructorn";
}
~MyClass() {
cout << "Destructingn";
}
int getval() { return val; }
// Return an object.
MyClass mkBigger() {
Myclass o(val * 2); // mkBigger() returns a MyClass object.
return o;
}
};
void display(MyClass ob)
{
cout << ob.getval() << 'n';
}
int main()
{
cout << " Before Constructing a.n";
MyClass a;
cout << "After constructing a.nn";
cout << "Before call to display.n";
display(a);
cout << "After display() returns.nn";
cout << "Before call to mkBigger().n";
a = a.mkBigger();
cout << "After mkBigger() returns.nn";
cout << "Before second call to display.n";
display(a);
cout << "After display() returns.nn";
return 0;
}
这给了我们以下输出:
Before Constructing a.
Inside constructor
After constructing a.
Before call to display.
10
Destructing
After display() returns.
Before call to mkBigger()
Inside constructor
Destructing
Destructing
After mkBigger() returns.
Before second call to display.
20
Destructing
After display() returns.
Destructing
Schildt 接着解释说,在 mkBigger(( 调用期间有两个"破坏"消息的原因是:
当函数返回对象时,会自动创建一个临时对象,该对象保存返回值。函数实际返回的正是此对象。返回值后,将销毁此对象。
我真的很惊讶没有3条"破坏"消息。我有以下问题:给定 mkBigger(( 的定义,创建了一个新的 MyClass 实例,并且该实例被返回并放置在a的地址中。因此,当做
a = a.mkBigger();
因此,我的印象是,以前保存在 a 中的原始对象不再被a引用。这是对的吗?如果是这样,那么我有以下问题:
有人告诉我C++有一些垃圾收集的微小概念。因此,该物品会被垃圾收集吗?这个对象现在在哪里?这是许多人在谈论C++的"危险"时提到的可能令人恐惧的记忆泄漏的一个例子吗?
mkbigger()
中的一个析构函数在o
上调用,MyClass 实例按值传入;它在函数结束时超出范围。另一个是在销毁时返回的o
的临时副本上调用的。还有什么超出范围?main()
不a
;因此,不应期望调用第三个析构函数。当自动对象超出范围时,C++ 不会在调用析构函数之外提供垃圾回收。
与其他一些现代语言不同,a
不会"保留对对象的引用";a
是对象,因为它是保存原始数据成员的一定数量的字节。当你执行a = a.mkBigger();
时,调用MyClass
的默认赋值运算符,它只是将右侧临时对象内的val
复制到a
内部的val
中,覆盖已经存在的值。a = a.makeBigger()
相当于a.val = a.makeBigger().val
如果val
是公开的。
当您使用new
分配内存,然后无法使用delete
来释放该内存时,会发生内存泄漏。对于在内部执行此操作的类,必须至少编写自己的复制构造函数、赋值运算符和析构函数。
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- C++:在另外两个对象之间共享一个对象
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 我正在尝试创建一个 C++ 贪吃蛇游戏,但我似乎无法绘制第二个高度边框,我该如何解决这个问题?
- 一个 2D 数组,并按行存储值.第一个循环用于行索引,第二个循环用于列索引
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- 如何使用std::lower_bound比较对象变量,而不使用第二个对象进行比较
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- OpenGL:第二个VBO破坏了第一个VBO
- 我正在尝试将我的 c++ 数组从第二个索引切到最后一个索引
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 2 个 COM 对象,并在另一个对象中使用其中一个对象的接口
- 在C++到第一个对象中创建第二个对象时,第一个对象会去哪里?