C++ 成员函数需要指针,通过引用传递的坏习惯?

标签 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;
}

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

最佳答案

好吧,这两种方法都是正确且很好的,但在您的情况下,使用指针可能会更好,因为与指针不同,引用变量只能在初始化时赋值。使用相同的指针,您稍后可以传递不同的类对象。

关于C++ 成员函数需要指针,通过引用传递的坏习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25228074/

相关文章:

c++ - 如何在静态库 (Visual Studio) 中嵌入图标 (.ico)

c++ - 尝试使用ostream <<运算符对象时,与{fmt} 6.2.1-3 + clang 10.0.0的链接问题

c++ - 如何将结构 vector 写入 json 文件?

c++ - 这个 C++ while 循环是如何工作的?

vba - 如何通过 CallByName 传递参数数组 ByRef?

c++ - 引用和指针在一起的意义?

c++ - C++ 是通过值还是引用传递对象?

javascript - 模块之间不持久的解构变量值

c++ - 指针大小和传递引用与传递指针

c++ - 如何在 C++ 中将命令行参数的整个集合(char**)作为只读传递?