在c ++中初始化指针

时间:2014-05-07 14:31:49

标签: c++ pointers reference

我开始学习C ++和指针。但是我在初始化时有点困惑。根据我的理解,如果我有一些类X,则以下代码有效:

X* pointer = new X();

这让我感到困惑,因为我希望你想通过给一个对象的地址来初始化一个指针,而不是对象本身,如: / p>

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

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

6 个答案:

答案 0 :(得分:11)

Operator new返回已创建对象的地址。它不会返回对象本身。

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

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

delete &x;

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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

X objectOne;
X* pointer = &objectOne

答案 4 :(得分:2)

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

X * ptr = new X();

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

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

X object = <some value>;

X* ptr = &object; 

欢迎使用C ++和快乐编码:)

答案 5 :(得分:2)

假设你有一个带有两个整数的结构,它们在结构构造函数中被初始化为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

或者用语言表示:

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