【发布时间】:2014-10-03 09:13:05
【问题描述】:
如果 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;
}
我喜欢一致性,默认为第一种,但我怀疑第二种形式被认为是更好的做法。是这样吗?
【问题讨论】:
-
指针传递......
-
两者都可以,但我个人更喜欢指针。如果一个函数在返回后会保留对该对象的引用,我会使用一个指针来提醒我何时调用该函数。
-
“如果 C++ 类成员函数需要指向对象的指针作为参数,那么通过引用传递是否被认为是不好的做法?” - 如果一个函数需要一个指针并且你传递一个非指针,那么它甚至不会编译。因此,如果它需要一个指针,请用指针调用它。如果它需要引用,请使用引用调用它。就这么简单。
-
@TheParamagneticCroissant 我认为他的意思是该函数的底层逻辑需要一个指针,他不确定该函数应该采用指针还是引用。
-
@PeterClark 如果它需要一个指针,那么只有一个指针就足够了。如果它需要修改参数,那么两者都可以。如果他不想复制参数,那么(const)指针和引用都可以解决问题。不幸的是,OP 正在寻找三个替代方案中的哪一个是模棱两可的。
标签: c++ pass-by-reference pass-by-pointer