2016-04-02 19 views
0

例如:我为什么用C返回构造很迷茫++是合法

#include<iostream> 
using namespace std; 
class exa{ 
    private: 
    int a; 
    public: 
    exa(int b = 0):a(b){} 
    exa Add(exa obj){ return exa(a+obj.geta()); } //What happened over  there? 
    int geta(){return a;} 
}; 
int main() 
{ 
    exa c1(2),c2; 
    c2.Add(c1); 
    cout << c2.geta() << endl; 
    return 0; 
} 
+1

您没有返回构造函数。您正在返回使用构造函数构造的对象。 'return exa(a + obj.geta())'返回使用'a + obj.geta()'作为整数参数构造的'exa'对象。它调用构造函数:'exa(int b = 0);'用这些参数。类似于你的做法:'exa c1(2)'。您将返回一个匿名实例,而不是使用'c1'等命名实例。 IE:'exa(2)'。 – Brandon

+0

@布兰登:请在_answer section_中写下答案,而不是评论。谢谢。 –

回答

1

注意要传递参数给构造。所以你不是返回一个构造函数,而是调用它来构造类的一个对象。由于您未使用new,因此该对象的存储将分配到堆栈中。

这里,方法Add正在返回(按值)类exe的对象。

实际上,在您的main中使用它的方式,它没有做任何事情,因为c2.Add(c1)的结果被忽略。

如果你写了c2 = c2.Add(c1)那么新对象将被复制(使用默认分配operator=)到c2,你应该看到输出2

+0

非常感谢!我知道了;谢谢。 @szym –