初始化指向结构 c++ 的 const 指针

Posted

技术标签:

【中文标题】初始化指向结构 c++ 的 const 指针【英文标题】:Initializing a const pointer to a structure c++ 【发布时间】:2017-05-30 09:07:42 【问题描述】:

我是 C++ 的初学者,对标头中声明的 const 指针的初始化感到困惑。仅举一个例子,我的标题中有一个结构和一个类,例如:

/* header file.h */
typedef struct A ...  A;

class myClass
    protected:
        A *const myPtrA;

又想实例化myPtrA的内容,比如在构造函数中,知道A是一个由子结构组成的相当复杂的结构,需要动态实例化:

/* source file.cpp */
#include file.h

myClass::myClass() 
   A *tmpA = new A;
   *myPtrA = *tmpA;

这是初始化我的 const 指针 myPtrA 的好方法吗?如果每个新调用都需要一个专用的删除调用,我可以在 *myPtrA = *a; 行之后立即删除我的指针 tmpA 吗?没有丢失 myPtrA 指向的内容的风险?

提前感谢您的宝贵时间(请原谅我的英语;))

qroh

【问题讨论】:

Find a good beginners book 并了解构造函数初始化列表 顺便说一下,在 C++ 中,struct 就像一个类,唯一的区别是默认可见性(public 代表 structprivate 代表 class)。这意味着您不需要typedef 来获得struct typedef struct A ... A; 是定义结构的 C 方式。在 C++ 中,您可以像对类一样定义它:struct A...;。 C++ 中结构和类的唯一区别是默认可见性。 知道A是一个由子结构组成的相当复杂的结构,需要动态实例化 嗯..为什么不能在initializer list 通过构造函数的调用?你为什么认为,你需要在这里动态分配。注意:您显示的示例表现出未定义的行为,因为 myPtrA 未初始化。不,*myPtrA = *tmpA; 不是它的初始化。该行正在尝试 dereference 指针,该指针从未初始化。 为什么你一开始还有一个指针? 【参考方案1】:
*myPtrA = *tmpA;

这是初始化我的 const 指针 myPtrA 的好方法吗?

没有。你根本没有初始化myPtrA。它是默认初始化的,因此具有不确定的值。取消引用具有不确定值 (*myPtrA) 的指针具有未定义的行为。

我可以在 *myPtrA = *a; 行之后立即删除我的指针 tmpA吗?没有丢失 myPtrA 指向的内容的风险?

是的,它是安全的。 myPtrA 指向的对象是tmpA 指向的对象的副本(通过赋值)。但是,如果您可以直接创建/修改副本,那么首先分配动态对象、复制它然后销毁它是完全没有意义的。

下面是如何正确初始化成员指针的例子:

class myClass
    protected:
        A *const myPtrA = new A;
;

PS。虽然学习如何执行此操作很有用,但您几乎不应该在实际程序中手动管理内存。而是使用 RAII 容器,例如 std::unique_ptr

【讨论】:

非常感谢,很清楚! “分配一个动态对象,复制它然后首先销毁它是完全没有意义的”我同意,但我想确保它毫无意义;)再次感谢

以上是关于初始化指向结构 c++ 的 const 指针的主要内容,如果未能解决你的问题,请参考以下文章

12.3 C++常指针

12.3 C++常指针

12.3 C++常指针

深入理解C++的const限定符

C++中强行修改const常量的问题

C++指向对象的常指针