首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++新运算符

C++新运算符
EN

Stack Overflow用户
提问于 2012-03-06 03:49:50
回答 4查看 213关注 0票数 2

假设我有一个

代码语言:javascript
复制
class A
{
  int A1;
  void Af();
};

然后我就做了:

代码语言:javascript
复制
A  hA;
A* pA = new A();

现在,hA是堆栈中的一个对象;我可以使用

代码语言:javascript
复制
hA.A1 = 52 // for example

但是pA只是指向了class A,这有什么用或方便的?(有什么例子吗?)

第二期:

当我执行A* pA = new A()时,我在堆中分配了什么吗?后台有没有malloc()?若否,原因何在?为什么int *p_array = new int5会在5个int的堆中分配内存,而不是A* pA = new A()?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-06 03:51:22

代码语言:javascript
复制
A  hA = new A();

导致编译器错误。在堆栈上定义变量的正确方法是

代码语言:javascript
复制
A ha;

但是pA只指向了A类,这有什么用或有什么用处(请举个例子?)

在内存中的某个位置,你有一个A类型的对象,pa指向它。如果要将该对象的A1成员设置为52,请编写

代码语言:javascript
复制
pA->A1 = 52;

为什么是有用的部分并不是一个真正的问题。

当我执行A*

=A()时,我在堆中分配了什么吗?

是的,你做到了。new做两件事:分配内存和调用构造函数。

在后台有没有任何malloc()?

这是未指定的,但在许多实现中,new是通过malloc实现的

为什么int[] A= A42会在42个整数的堆中分配内存,而不是A pA =

A()?

先生,这也是一个编译器错误。你的意思是

代码语言:javascript
复制
int* A = new A[42];

这是在堆上分配数组并在必要时调用构造函数的operator new[] (对于整型数组则不是)。

票数 4
EN

Stack Overflow用户

发布于 2012-03-06 04:28:17

当编译时容量或数据量未知时,才会使用指向对象的指针。从用户接收文本就是一个很好的例子。用户是否会输入5个字符,10,1k?

如果我的程序分配1k,而用户从未输入超过32个字符,这是对空间的浪费。

动态内存分配的另一个用途是在对象之间传递信息:

对象1创建一本书,但不负责销毁它。

Object 2校对图书,生成更正列表,但不会销毁图书。

对象3将表添加到书中,但仍然不会销毁它。

对象4保存这本书,然后销毁它。

请阅读"C++常见问题解答“,快速解答常见的C++问题。

票数 0
EN

Stack Overflow用户

发布于 2012-03-06 04:56:22

但是pA只是指向了class A,这有什么用或方便的?(有什么例子吗?)

事实并非如此。pA指向A对象,所以*pA是一个对象,就像hA是一个对象一样:

代码语言:javascript
复制
(*pA).A1 = 52 // for example

当您执行A* pA = new A()时,是的,会发生动态分配。不一定是对malloc()的调用,而是某种东西。(忽略用户定义的operator new的使用,它可以做任何你喜欢的事情)

new A()主要做两件事。它在某个地方为对象分配空间。如果成功,那么它将构造一个您在该位置请求的类型的对象。如果对象构造成功,那么它只返回一个指向该对象的指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9572967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档