使用构造函数返回

问题描述:

只是一个简短的问题。使用构造函数返回

我写了一些代码,返回一个自定义的类命令,我写的代码似乎工作正常。我想知道是否有任何理由,我不应该这样做。这件事情是这样的:

Command Behavior::getCommand() 
{ 
    char input = 'x'; 

    return Command (input, -1, -1); 
} 

不管怎样,我读到的构造并不意味着有一个返回值,但这部作品在G ++。

感谢您的任何建议,

里斯

+1

需要注意的是:在语义上,这会创建一个临时对象,然后在函数返回时将其复制。但是,编译器可以执行所谓的返回值优化或RVO。这意味着它不允许复制,例如:'Command x = getCommand();'将直接构造'x',而不是使'x'成为返回的副本。 – GManNickG 2010-04-15 03:26:51

+2

长话短说:你一切正常! – Potatoswatter 2010-04-15 03:33:11

构造函数本身没有返回值。它所做的是构造一个临时的Command对象,并将构造的对象返回给调用者。它与您所说的相同:

Command temp(input, -1, -1); 
return temp; 

它可以在任何C++编译器上工作。

+0

谢谢!很高兴我不必重写它,这是很好的功能。 – 2010-04-15 03:40:19

getCommand不是构造函数。以上是完全有效的,并且通常也是有效的,这归因于返回值优化(RVO),如果您实例化了局部变量并将其返回,那么(我认为)不适用。

+0

正式指出,欢呼! – 2010-04-15 03:40:46

+2

在许多情况下,局部变量也可以反复使用sans-copy构造函数。 – 2010-04-15 04:10:06

+1

它被称为命名返回值优化或NRVO。 – GManNickG 2010-04-15 04:38:44

该构造函数没有返回值;你明确地构造了一个类的临时实例,然后返回它。这没什么错,除了它会做一个副本。

如果你想避免复制,你有几个选择,其中之一是有一个输出参数是一个Command*并使用新的和删除。

您没有带返回值的构造函数。 Command::Command(char, int, int)是您的构造函数。

你有一个方法返回一个完全正常的对象。