如果C ++类成员函数需要一个指向对象的指针作为参数,那么通过引用传递是否被认为是不好的做法?
例如,下面的代码可以正常工作,但是如果不通过引用传递它就会变成危险的代码,并且会在运行时导致灾难性的错误。
class ClassA
{
public:
void SetPointer(const ClassB& classb) // Remove 1 ampersand and serious errors will occur
{
if(ptr_to_classb == nullptr) // Initialized to nullptr in constructor
ptr_to_classb = &classb;
else
throw(...); // Throw some error
}
private:
ClassB* ptr_to_classb;
}
考虑是否通过值传递,并且创建了参数的副本,这在以后解除引用时会是灾难性的。
另一种选择是:
class ClassA
{
public:
void SetPointer(const ClassB* const classb)
{
if(ptr_to_classb == nullptr) // Initialized to nullptr in constructor
ptr_to_classb = (ClassB*)(classb);
else
throw(...); // Throw some error
}
private:
ClassB* ptr_to_classb;
}
我喜欢一致性,默认为第一种类型,但我怀疑第二种形式被认为是更好的做法。是这种情况吗?
答案 0 :(得分:1)
我的观点是,如果将null参数传递给方法是有效的事情(即方法执行的逻辑对空指针有效),则使用指针。如果参数永远不应为null,则使用引用。
在您的情况下,这取决于它是否对ClassA :: ptr_to_classb有效为null。如果你已经设置了ptr_to_classb(意味着你不想改变它所指向的内容),你甚至可以考虑存储一个引用,并在ClassA的构造函数中传递它,摆脱ClassA :: SetPointer。
关于引用vs指针here as well还有其他一些意见。
答案 1 :(得分:0)
嗯,这两种方法都是正确而且很好但是在你的情况下,使用指针可能会更好,因为引用变量只能在初始化时分配一个值,而不像指针。使用相同的指针,您可以稍后传递不同的类对象。
答案 2 :(得分:0)
您的方法只是设置对象的字段,因此您似乎想要使用字段的类型(指针,而不是引用)。你写了
我想,我喜欢一致性,默认为第一种类型
指的是规则"尽可能使用引用;使用指针oterwise"。我认为你的案例是这条规则的一个例外,因为声明
void do_stuff(ClassA& object)
通常表示"在对象上做东西,忘掉它",你的情况就不同了。