【发布时间】:2022-01-21 05:20:54
【问题描述】:
我不太确定将*d 和d2 传递给构造函数之间的区别是:
#include <iostream>
using namespace std;
class Data
{
public:
int number;
};
class Node {
public:
Data data;
Node() {};
Node(Data d) : data(d) {};
};
int main()
{
Data* d = new Data();
Node* n = new Node(*d);
Data d2;
Node* n2 = new Node(d2);
return 0;
}
我可以传递 *d 和 d2,但是在这两种情况下,“Node”类中的数据成员“data”本身仍然是一个对象,对吗?或者传递对象和动态对象之间有区别吗?
【问题讨论】:
-
这里有三个
Data对象:类中的data成员,d构造函数参数,以及d或d2。前两个不在乎第三个。 -
对。由于这是 C++ 而不是 C#,所有这 4 个对象都是单独的对象,当您将一个对象分配给另一个对象时,您就是将数据从一个对象复制到另一个对象。 (如果你想检查这个,你可以用
printf打印出任何对象的地址。) -
@David Grayson 谢谢,这回答了我的问题:)
-
其实我们看看,有4个长寿命的数据对象,从
main函数的角度来看,它们被命名为:*d、d2、n->data和@ 987654334@。当您调用 Node 构造函数Node(Data d)时,还会创建 2 个 临时 数据对象,因为调用涉及在名为d的堆栈上创建一个Data对象,并且您调用构造函数两次.所以看到了 6 个 Data 对象,并且执行了几个复制(或移动)操作以在它们之间传递数据。