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