0

Is it safe to return object from within namespace. In below code call() is returning bag object by value. But scope of newly created object is within namespace... so had a doubt if it is right way to do it.

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;
        }
};

My second question is regarding copy constructor. In main() i am trying to call copy constructor by using following expression, but compiler is throwing error... how can i achieve this

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

3 回答 3

4

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

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

b.call()

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

bag(bag& c)

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

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

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

于 2013-06-25T17:33:25.870 回答
2

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

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

于 2013-06-25T17:35:00.677 回答
0

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

于 2013-06-25T19:11:40.883 回答