【问题标题】:is it safe to return object from namespace?从命名空间返回对象是否安全?
【发布时间】:2013-06-25 17:30:11
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

b.call()

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

bag(bag& c)

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

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

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

【讨论】:

  • @user1057741:我真的不确定我明白你在说什么:(
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • &amp;b 产生一个指向 abc::bag (abc::bag *) 的指针。复制构造函数通常采用 const 引用 (abc::bag const &amp;)。所以你的代码也不会调用复制构造函数。
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多