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



从命名空间中返回对象是否安全。在下面的代码中,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

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

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

b.call()

产生一个右值(一个临时对象),并且您的复制构造函数接受一个左值引用:

bag(bag& c)

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

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

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

命名空间是唯一用于解析名称的东西。它对对象的生存期或其他任何事情都没有影响。所以,如果您的代码就在名称空间之外,那么它在内部就很好。

您应该在复制ctor(并且缺少op=)签名中正确使用const

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

最新更新