我最近开始尝试在代码中强制执行const正确性。在函数定义中,我将一个常量指针提供给类LorentzM
的常量对象:
void AnalysisObject::SetOwnedPointer(const int maptotree_In, const LorentzM* const momentum_In){
owned_pp4_original.reset(momentum_In);
maptotree=maptotree_In;
}
其中owned_pp4_original
是
shared_ptr<LorentzM> owned_pp4_original;
我这样做,因为这个函数SetOwnedPointer不应该更改LorentzM* momentum_In
,也不应该更改它指向的对象,所以常量指针指向常量对象。
但是,为momentum_In指向的对象创建了shared_ptr,并且我执行希望稍后使用此shared_ptr更改对象:
void ChangeLorentzM(const double px, const double py, const double pz, const double E){
owned_pp4_original->SetPxPyPzE(px,py,pz,E); //THIS CHANGES THE OBJECT
}
所以,一方面,能够做到:
owned_pp4_original.reset(momentum_In);
owned_pp4_original
应为shared_ptr<const LorentzM>
然后,我无法通过它改变对象。
这张照片有什么问题?
非常感谢。
答案 0 :(得分:5)
我这样做,因为这个函数SetOwnedPointer永远不会改变 LorentzM * momentum_In也不应该改变它的对象 指向,所以常量指针指向常量对象。
这不够理智。该函数可能不会直接更改对象,但它授予另一个对象(shared_ptr
)修改对象的权限。它不能授予它自己没有的权利。因此,将其更改为指向非const对象的指针。
同样的事情,例如,如果你有一个具有非const引用成员的类。您需要将非const对象传递给它的构造函数,即使构造函数本身不修改该对象。构造函数需要授予对象的引用成员权限来修改对象,如果它本身没有这些权限,则不能这样做。