在C++中返回Vector相当于c#

Dzy*_*ann 2 c++ vector

我有很多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)的复制构造函数?

Jon*_*son 5

实际上你不需要创建myCloneArray.只需返回myArray,它就会传递一份副本.这是每个编译器的情况.

通常,如果返回一个对象,并且它没有通过引用或作为指针返回,则将在类上调用复制构造函数,并将对象作为参数传递.唯一没有发生的情况是复制构造函数是否已被删除,在这种情况下,您发布的代码无论如何都不会编译.

C++和C#或JAVA之间的不同之处在于,在C#和JAVA中,您实际上是返回一个指针,而不是复制(或移动)堆栈中的对象.如果你这样想,那么语言之间的行为是相同的.