2013-06-25 38 views
0

从命名空间返回对象是否安全?在下面的代码call()按值返回包对象。但是新创建的对象的范围在命名空间内......所以有一个疑问,如果它是正确的方式来做到这一点。从命名空间返回对象是否安全?

namespace abc{ 

class bag{ 

    public: 
     bag() 
     { 
      cout<<"\nconstructor called"; 
     } 
     ~bag() 
     { 
      cout<<"\ndestructor called"; 
     } 
     bag(bag &c) 
     { 
      cout<<"\ncopy constructor called"; 
     } 
     bag call() 
     { 
      bag f; 
      return f; 
     } 
}; 

我的第二个问题是关于复制构造函数。 在main()我试图通过使用下面的表达式调用拷贝构造函数,但是编译器抛出错误......我如何才能做到这一点

abc::bag b; 
abc::bag c=b.call(); // trying to call copy constructor ,but getting compile time error 
+0

什么是编译时错误? –

+1

你不必怀疑,您有任何疑问,请参阅http://www.cs.uic.edu/bin/view/Jakob/IndianEnglish –

回答

4

有没有危险whatsover从的一个成员函数返回对象属于某个命名空间的类。我没有看到你可能提到的问题。

至于第二个问题,那就是因为表达式:

b.call() 

产生一个右值(临时对象),和您的副本构造函数接受左值参考:

bag(bag& c) 

由于左值引用不能绑定到右值,编译器正在向你大喊。你应该让你的拷贝构造函数具有规范签名,并接受左值参考const代替(左值引用const可以绑定到右值):

bag(bag const& c) 
//  ^^^^^ 

毕竟,你通常并不需要/想修改的对象你想创建一个副本。

+0

@ user1057741:我真的不知道我知道你在说什么:( –

2

命名空间来解析名称的事情。它不会影响对象的生命周期或其他任何事情。所以如果你的代码是在命名空间外部的话,那么它就很好。

你应该正确使用拷贝构造函数const(和失踪OP =)签名。

0

abc::bag c=b.call();这有什么好做的一个拷贝构造函数。要调用你已经实现的拷贝构造函数,你应该写abc::bag c(&b)

+0

'&b'产生一个指向'abc :: bag'('abc :: bag *')的指针。一个拷贝构造函数通常需要一个const引用('abc :: bag const&')。也可以调用复制构造函数。 –

相关问题