我开始学习C ++和指针。但是我在初始化时有点困惑。根据我的理解,如果我有一些类X
,则以下代码有效:
X* pointer = new X();
这让我感到困惑,因为我希望你想通过给一个对象的地址来初始化一个指针,而不是对象本身,如: / p>
X* pointer = &(new X());
C ++会自动将前者转换为后者吗?感谢。
答案 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
或者用语言表示:
a
和b
的构造函数,这意味着上图中的aaaa
和bbbb
内存插槽设置为0001和0002,或1000和2000,取决于平台的endianess。