我有很多C#代码,我必须用C++编写.我在C++方面没有太多经验.
我正在使用Visual Studio 2012来构建.该项目是C++中的静态库(不是在C++/CLI中).
我知道这是一个基本问题,但我一直在阅读,我感到很困惑.在C#代码中,他们在几个地方使用了double []数组,从他们使用它们的方式来看,我看到在C++中替换它们的最好方法是使用vector.
C#中有一些属性可以返回数组的副本,我想在C++中做同样的事情.
注意:myArray是MyClass的成员.
C#
public double[] MyArray
{
get
{
/*** Some Code Here ***/
double[] myCloneArray= (double[])myArray.Clone();
return myCloneArray;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在C++中完成类似的事情,但最大限度地减少创建的副本数量.这是正确的吗?
C++
vector<double> MyClass::GetMyArray()
{
/*** Some Code Here ***/
vector<double> myCloneArray= vector<double>(myArray);
return myCloneArray;
}
Run Code Online (Sandbox Code Playgroud)
我只想创建一个myArray副本.由于我没有返回引用,我的理解是,在返回myCloneArray时,将创建它的副本.这总是如此吗?
我想确定,所以我在互联网上阅读,但我很困惑,因为有些人说有些编译器不这样做.
我想确保我总是发送副本,而不是相同的向量.我现在正在使用编译器,但最终我的代码也将在其他编译器中构建,所以我需要确保这不依赖于编译器
这是我能走的最好的方式吗?或者我可以减少代码,像这样:
C++
vector<double> MyClass::GetMyArray()
{
/*** Some Code Here ***/
return myArray;
}
Run Code Online (Sandbox Code Playgroud)
并且将调用vector(myArray)的复制构造函数?
实际上你不需要创建myCloneArray.只需返回myArray,它就会传递一份副本.这是每个编译器的情况.
通常,如果返回一个对象,并且它没有通过引用或作为指针返回,则将在类上调用复制构造函数,并将对象作为参数传递.唯一没有发生的情况是复制构造函数是否已被删除,在这种情况下,您发布的代码无论如何都不会编译.
C++和C#或JAVA之间的不同之处在于,在C#和JAVA中,您实际上是返回一个指针,而不是复制(或移动)堆栈中的对象.如果你这样想,那么语言之间的行为是相同的.