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