从命名空间返回对象是否安全?

时间:2013-06-25 17:30:12

标签: c++ object c++11 namespaces

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

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

3 个答案:

答案 0 :(得分:4)

从属于某个命名空间的类的成员函数返回对象时没有任何危险。我没看到你可能指的是什么问题。

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

b.call()

产生一个rvalue(一个临时对象),你的拷贝构造函数接受一个左值引用:

bag(bag& c)

由于左值引用无法绑定到rvalues,编译器会对你大喊大叫。您应该让您的复制构造函数具有规范签名并接受对const的左值引用(对const的左值引用可以绑定到rvalues):

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

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

答案 1 :(得分:2)

命名空间仅 用于解析名称的东西。它对对象的生命周期或其他任何东西都没有影响。因此,如果您的代码在命名空间之外,那么内部就很好。

你应该在copy ctor(和缺少op =)签名中正确使用const

答案 2 :(得分:0)

abc::bag c=b.call();这与复制构造函数无关。要调用已实现的复制构造函数,您应该编写abc::bag c( &b )