相关疑难解决方法(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万
查看次数

何时重载通过引用(l值和r值)优先传递给值?

我已经看到它说一个operator=带有相同类型by-value的参数的文件在C++ 11中既作为复制赋值运算符又作为移动赋值运算符:

Foo& operator=(Foo f)
{
    swap(f);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

替代方案的重复次数将超过两倍,并且可能出现错误:

Foo& operator=(const Foo& f)
{
    Foo f2(f);
    swap(f2);
    return *this;
}

Foo& operator=(Foo&& f)
{
    Foo f2(std::move(f));
    swap(f2);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

在什么情况下,ref-to-const和r-value重载优先通过值,或何时需要?我正在考虑std::vector::push_back,例如,它被定义为两个重载:

void push_back (const value_type& val);
void push_back (value_type&& val);
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,pass by value 用作复制赋值运算符和移动赋值运算符,无法push_back在Standard中定义为单个函数?

void push_back (value_type val);
Run Code Online (Sandbox Code Playgroud)

c++ overloading assignment-operator copy-and-swap c++11

24
推荐指数
1
解决办法
1945
查看次数