相关疑难解决方法(0)

如何在C++中"返回一个对象"?

我知道标题听起来很熟悉,因为有很多类似的问题,但我要问问题的不同方面(我知道在堆栈上放置东西并将它们放在堆上之间的区别).

在Java中,我总是可以返回对"本地"对象的引用

public Thing calculateThing() {
    Thing thing = new Thing();
    // do calculations and modify thing
    return thing;
}
Run Code Online (Sandbox Code Playgroud)

在C++中,要做类似的事情,我有2个选项

(1)每当我需要"返回"一个对象时,我都可以使用引用

void calculateThing(Thing& thing) {
    // do calculations and modify thing
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

Thing thing;
calculateThing(thing);
Run Code Online (Sandbox Code Playgroud)

(2)或者我可以返回指向动态分配对象的指针

Thing* calculateThing() {
    Thing* thing(new Thing());
    // do calculations and modify thing
    return thing;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

Thing* thing = calculateThing();
delete thing;
Run Code Online (Sandbox Code Playgroud)

使用第一种方法我不必手动释放内存,但对我而言,它使代码难以阅读.第二种方法的问题是,我必须记住delete thing;,这看起来不太好.我不想返回复制的值,因为它效率低(我认为),所以这里提出问题

  • 是否有第三种解决方案(不需要复制值)?
  • 如果我坚持第一个解决方案,有什么问题吗?
  • 何时以及为什么要使用第二种解决方案?

c++ performance return reference

155
推荐指数
5
解决办法
8万
查看次数

返回没有副本的c ++ std :: vector?

是否可以从函数返回标准容器而无需复制?

示例代码:

std::vector<A> MyFunc();

...

std::vector<A> b = MyFunc();
Run Code Online (Sandbox Code Playgroud)

据我所知,这会将返回值复制到一个新的向量b中.使函数返回引用或类似的东西可以避免复制吗?

c++ stl copy temporary return-value

29
推荐指数
2
解决办法
3万
查看次数

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

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

c++ vector

2
推荐指数
1
解决办法
1375
查看次数

标签 统计

c++ ×3

copy ×1

performance ×1

reference ×1

return ×1

return-value ×1

stl ×1

temporary ×1

vector ×1