C ++成员函数需要指针,不良实践通过引用传递?

时间:2014-08-10 11:21:10

标签: c++ pass-by-reference pass-by-pointer

如果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;
}

我喜欢一致性,默认为第一种类型,但我怀疑第二种形式被认为是更好的做法。是这种情况吗?

3 个答案:

答案 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)

通常表示"在对象上做东西,忘掉它",你的情况就不同了。