2015-04-27 187 views
2

破坏我有一个问题,我怎么能避免在课堂上的破坏。 我有示例代码C++在这里:如何避免

class Array { 
    int *p; 
    int n; 
public: 
    Array(int n_ = 0) { 
     p = new int[n_]; 
    } 
    ~Array(void) { 
     cout << "Deleted" << endl; delete []p; 
    } 
    friend Array operator+(Array A, Array B)  // the amount of elements A and B are the same 
    { 
     Array S(A.n); 
     for(int i=0; i < A.n; i++) 
      S.p[i] = A.p[i] + B.p[i]; 
     return S;  // object S has been destroyed before returned. 
    } 
}; 

在这里,当对象已经拿到了价值和回报。但是物品S在返回之前已经被毁灭毁灭了。任何人都可以帮助我避免破坏或某种方式让对象S可以返回到主体。由于

+3

提供一个拷贝构造函数,使S'的'返回副本(这是获取返回的)是有效的。 –

回答

2

您可以定义移动和/或拷贝构造函数(如果它不隐式定义)和值将被移动/它的破坏之前复制。

+0

感谢您的回答,但如果我使用复制构造函数的方式,它会浪费时间进行复制。因为如果我们应用它对于n = 1000,这将花费O(1000),我不想浪费时间的副本 –

+0

然后你可以使用移动语义,以避免拷贝,这将是更快的方式 – hrkz

+0

如果你看一下我的回答是,编译器在移动语义之前采用了另一种优化。 – Mouze

0

你可以提供一个副本构造函数,比它会变成你的编译器不调用它,因为NRVO(命名返回值优化)。

阅读维基:http://en.wikipedia.org/wiki/Return_value_optimization

用C++ 11 O C++ 14,可以使用移动语义,通用技术,移动昂贵的对象。

+0

是的,我认为是。但在场景中,我在对象中有很多元素,我会浪费很多时间来做对象的副本。 –

+0

尽管这只是一个移动专题课程。我发现至少在gcc的时候,如果你有一个移动构造函数而不是一个拷贝构造函数,RVO仍然会被使用。但是,只要将std :: move放在返回行上,标准需要移动构造函数才能运行 – evan

+0

您能为我写下来吗?我写它返回std :: move(S);但它也被摧毁了。 –