如何避免在C ++中通过引用传递临时对象时显式调用构造函数?

时间:2009-06-17 16:48:01

标签: c++ pass-by-reference

假设我有一个班级:

class String
{
public:
     String(char *str);
};

还有两个功能:

void DoSomethingByVal(String Str);
void DoSomethingByRef(String &Str);

如果我这样打电话给DoSomethingByVal:

DoSomethingByVal("My string");

编译器发现它应该创建一个临时的String对象并调用char *构造函数。

但是,如果我尝试以相同的方式使用DoSomethingByRef,我会收到“无法将参数从'char *'转换为'String&'”错误。

相反,我必须显式创建一个实例:

DoSomethingByRef(String("My string"));

可以让人感到烦恼。

有什么方法可以避免这种情况吗?

4 个答案:

答案 0 :(得分:9)

你需要传递const引用:

有关:

void DoSomethingByVal(String Str);

在这种情况下,编译器首先创建一个临时变量。然后将临时变量复制到参数中。

有关:

void DoSomethingByRef(String const& Str);

在这种情况下,编译器会创建一个临时变量。但临时变量不能绑定到引用,它们只能绑定到const引用,因此无法调用原始函数。请注意,std :: string对象构造函数采用const引用是复制构造函数的参数,这就是第一个版本工作的原因,因为临时仅绑定到复制构造函数的const引用参数。

答案 1 :(得分:2)

嗯,我不确定是否

void DoSomethingByRef(String &Str);
DoSomethingByRef(String("My string"));

实际上会编译。 rvalue不能绑定到对非const的引用(因为引用非const表示你将修改该值,修改临时值没有意义)。你确定你没有这样做:

String str("My string");
DoSomethingByRef(str);

如果你想让DoSomethingByVal取rvalue,那么参数必须是对const的引用:

void DoSomethingByRef(const String &Str);

答案 2 :(得分:0)

请:

DoSomethingByRef(const String& str);

答案 3 :(得分:0)

“我的字符串”不是字符串,它是一个c字符串,一个字符*,如果你愿意的话。您需要将该c字符串放入String对象中,然后您可以通过引用传递新的String对象。

另一点,你已经传递了一个char * ...它非常轻巧,只是一个指针。为什么要担心通过引用传递新对象?只需从堆中在该构造函数中分配一个新对象,然后将c-string复制到其中。