【发布时间】:2019-07-09 08:24:28
【问题描述】:
我一直在使用 java 但最近我不得不切换到 C++,我对一些不同的事情感到困惑。 我的问题是, 在 Java 中,
class Ex
{
public static void main(String[]args){
Ex e = func();
}
static Ex func(){
Ex ee = new Ex();
ee.x = 1;
ee.y = 2;
return ee;
}
}
class Ex
{
int x;
int y;
}
e 和 ee 相同。
但在 C++ 中,
vector<int> func()
{
vector<int>a;
a.push_back(1);
a.push_back(2);
return a;
}
int main()
{
vector<int>aa = func();
}
在这种情况下,a和aa是一样的?? 如果不一样,每次我要返回vector,是不是一直复制到调用区?
【问题讨论】:
-
在你的 c++ 代码中,
a和aa不是同一个对象。而且,是的,每次您调用func()时,您都会执行一次复制。 -
a和aa以及不同的对象。 C++func()返回构成对象的数据,而不是对象的引用或指针。 -
当前已移动(未应用复制省略时)。
-
在移动机制之前,C++ 会将数据从你的函数复制到一个新的向量中。在现代 C++ 中,您可以移动该内存或依赖编译器提供的一些优化。您可能想检查 RVO 机制:ibm.com/developerworks/community/blogs/…
-
如您所见,“参考”一词在两种语言中具有不同的含义。请注意,您的 C++ 代码根本不使用任何引用(至少不是为 C++ 定义的,其中返回值必须是
vector<int>&)。 Java 术语“引用”可以更多地被认为是 C++ 措辞中的一个指针(不完全但足够接近)。