在C++中使用指针总是坏的吗?

Eng*_*999 4 c++ pointers class pass-by-reference pass-by-pointer

我被告知要避免在C++中使用指针.似乎我无法避免它们,但是在我试图编写的代码中,或者我可能错过了其他很棒的C++特性.

我希望创建一个类(class1),它包含另一个类(class2)作为数据成员.然后我希望class2知道class1并能够与它通信.

我可以在class2中引用class1作为成员,但这意味着我需要在class2的构造函数中提供对class1的引用作为参数,并使用我不想要的初始化列表.我试图这样做而不需要构造函数来做.

我希望class2有一个名为Initialise的成员函数,它可以接受对class1的引用,但是如果不使用指针,这似乎是不可能的.人们会在这里推荐什么?提前致谢.

代码完全简化,只是为了获得主要想法:

class class1
{
    public:
        InitialiseClass2()
        {
            c2.Initialise(this);
        }

    private:
        class2 c2;

};

class class2
{
    public:
        Initialise(class1* c1)
        {
            this->c1 = c1;
        }

    private:
        class1* c1;

};
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 5

没有使用指针,这似乎是不可能的

那是不对的.实际上,要处理对其他对象的引用,请引用构造函数:

class class2
{
    public:
        class2(class1& c1)
           : c1(c1)
        {}

    private:
        class1& c1;
};
Run Code Online (Sandbox Code Playgroud)

这里的关键是初始化,而不是分配参考.这是否可能取决于你是否可以摆脱你的Initialise功能并适应RAII(请做!).在那之后,这实际上是否是一个好主意取决于您的用例; 如今,通过使用其中一种智能指针类型,你几乎可以肯定地使所有权和生命周期语义更加清晰 - 即使它只是一种std::weak_ptr.

无论如何,说得更一般.

指针"总是"不好吗?不,当然不.我几乎很想说自己管理动态记忆"总是"不好,但我不会做出概括.

你应该避开它们吗?是.

不同之处在于,后者是引导您远离手动内存管理的指导原则,前者是一种未经尝试的禁令.


Ser*_*eyA 4

不,在 C++ 中使用指针一点也不坏,而且我一遍又一遍地看到这种反建议。不好的是自己管理指针,除非您正在创建一个管理指针的低级实体。

我将再次做出非常明确的区分。使用指针是很好的。很少有真正的 C++ 程序可以不使用指针。管理指针是不好的,除非您正在使用指针管理器。

  • @SergeyA 顺便说一句,我认为很明显我们都同意这个问题。我们只是在措辞上存在分歧(我认为是根本上的)。这是我的观点:这个问题再次表明了 C++ 中的指针通常是如何被教授得非常糟糕,从而导致糟糕的、有缺陷的、低效的代码。打破这个循环的方法是取消 C++ 中指针的特权位置。指针应该被视为另一种类型,可以酌情并深思熟虑地使用,而不是默认的首选类型。作为一名程序员,我在需要时使用原始指针。作为一名老师,我厌恶 C++ 原始指针语法 (2认同)