【问题标题】:Initializing a pointer in c++在 C++ 中初始化一个指针
【发布时间】:2023-03-14 05:45:02
【问题描述】:

我开始学习 C++ 和指针。但是我对他们的初始化有点困惑。据我了解,如果我有某个类X,则以下代码有效:

X* pointer = new X();

这让我感到困惑,因为我希望您希望通过给它一个对象的 地址 来初始化一个指针,而不是对象本身,如下所示:

X* pointer = &(new X());

C++ 会自动将前者转换为后者吗?谢谢。

【问题讨论】:

  • 收起你的 Java 书籍。 C++ 是一种不同的语言,其中的词看起来很熟悉,但含义却不同。

标签: c++ pointers reference


【解决方案1】:

运算符 new 返回创建对象的地址。它不返回对象本身。

您也可以使用对创建对象的引用。例如

X &x = *( new X() );
//...

delete &x;

【讨论】:

    【解决方案2】:

    new 被定义为返回一个指针,而不是一个对象。

    【讨论】:

      【解决方案3】:

      通常,new 为堆上的一个对象分配内存,调用该对象的构造函数来初始化该内存,然后返回一个指向已分配内存地址的指针。

      关于您的场景的关键信息是,尽管new 有创建对象的副作用,但返回值是一个指针,而不是对象本身。

      【讨论】:

        【解决方案4】:

        您正在使用“新”运算符。在 C++ 中,此运算符返回对象的地址,而不是对象

        您可以使用 & 运算符,但在对象上,像这样

        X objectOne;
        X* pointer = &objectOne
        

        【讨论】:

          【解决方案5】:

          不,C++ 不会将前者转换为后者,因为它们不一样。

          X * ptr = new X();

          这个语句调用X类的构造函数来初始化指针。否则这是必要的,您可能会收到空引用异常,即编译器可能会说您正在引用尚未初始化的内容,因此初始化很重要。

          然后一旦指针被初始化,你就可以让它指向一个像这样的对象:

          X object = <some value>;
          
          X* ptr = &object; 
          

          欢迎使用 C++,祝您编码愉快 :)

          【讨论】:

            【解决方案6】:

            假设你有一个结构体,其中有两个整数,在结构体构造函数中初始化为 1 和 2:

            struct two_ints
            {
                int a;
                int b;
            
                two_ints() : a(1), b(2) {}
            };
            

            假设您有一个 45 字节的堆内存空间,如下图所示。

                    1       2       3       4
            0   5   0   5   0   5   0   5   0   5
            |||||||||||||||||||||||||||||||||||||
            

            现在,如果您像这样在 45 字节堆上实例化 two_ints 结构:

            two_ints* ints = new two_ints();
            

            那么,从图形上看,operator new 在这个例子中将为你做的是:

                    1       2       3       4
            0   5   0   5   0   5   0   5   0   5
            |||||||||||||||||||||||||||||||||||||
                            aaaabbbb
                            ----
                            ^   ----
                            |   ^
                            |   |
                            |   +-- 4 bytes for field b
                            |
                            +-- 4 bytes for field a
                            |
                            +-- on address 20 in this 45-byte memory space
            

            或者说,它会:

            • 为 2 个 4 字节整数分配 8 字节内存,从内存地址 20 开始(在 this 示例中)。
            • 运行将值1和2赋值给ab的构造函数,也就是说上图中的aaaabbbb内存槽设置为0001和0002,或者1000和2000,取决于平台字节序。
            • 返回地址 20。

            【讨论】:

              猜你喜欢
              • 2013-04-26
              • 2015-05-01
              • 1970-01-01
              • 2018-01-09
              • 1970-01-01
              • 1970-01-01
              • 2016-12-11
              • 2011-04-10
              • 2012-05-24
              相关资源
              最近更新 更多