2013-06-25 74 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&')。也可以調用複製構造函數。 –

相關問題