C++新运算符
C++ new operator
假设我有一个
class A
{
int A1;
void Af();
};
然后我做:
A hA;
A* pA = new A();
现在,hA
是堆栈中的一个对象;我可以使用
hA.A1 = 52 // for example
但pA
只是指向class A
,这怎么有用或方便?(有什么例子吗?)
第二期:
当我做A* pA = new A()
;我在堆里分配了什么吗?背景中有malloc()
吗?如果没有,为什么不呢?为什么int*p_array=new int[5]会在5 int的堆中分配内存,而不是A*pA=new A()?
A hA = new A();
导致编译器错误。定义"堆栈上"变量的正确方法是
A ha;
但pA只指向A类,这有什么用处或少数(请举几个例子?)
在内存中的某个位置,你有一个类型为A的对象,pa指向它。如果你想将该对象的A1成员设置为52,你可以写
pA->A1 = 52;
为什么它是有用的部分并不是一个真正的问题。
当我做A*pA=新的A()时;我在堆里分配了什么吗?
是的,你做到了。new
做两件事:分配内存和调用构造函数。
后台有malloc()吗?
这是未指定的,但在许多实现中,new
是通过malloc
实现的
为什么int[]A=A[42]会在42 int的堆中分配内存,而不是ApA=new A()?
这也是一个编译器错误。你的意思是
int* A = new A[42];
这是operator new[]
,它在堆上分配数组,并在必要时调用构造函数(如果是int,则不是)。
当编译时容量或数据量未知时,对象指针的一次性使用。一个很好的例子是接收来自用户的文本。用户会输入5个字符,10,1k吗?
如果我的程序分配了1k,而用户输入的字符永远不会超过32个,这就是浪费空间。
动态内存分配的另一个用途是在对象之间传递信息:
对象1创建了一本书,但不负责销毁它。
对象2校对这本书,生成一个更正列表,但不会破坏这本书
对象3将表添加到书中,但仍然不会破坏它。
对象4保存书籍,然后销毁。
有关常见C++问题的快速答案,请阅读"C++常见问题解答"。
但
pA
只是指向class A
,这怎么有用或方便?(有什么例子吗?)
事实并非如此。pA指向一个A对象,所以*pA
是一个对象,就像hA
是对象一样:
(*pA).A1 = 52 // for example
当您执行A* pA = new A()
时,是的,会发生动态分配。不一定是对malloc()
的调用,而是一些东西。(忽略用户定义的operator new
的使用,它可以做任何你喜欢的事情)
new A()
主要做两件事。它在某个地方为对象分配空间。如果成功,那么它将构造您在该位置请求的类型的对象。如果对象构造成功,那么它只返回一个指向该对象的指针。
但pA只指向A类,这有什么用处或方便?(有什么例子吗?)
它既有用又方便,因为现在您有了类A的实例的地址,该实例不存在于堆栈中,而是存在于堆中。因此,如果您超出范围(从函数返回等等),它将存活下来。你可以把指针传得到处都是,你的实例仍然是
当我做A*pA=新的A()时;我在堆里分配了什么吗?后台有malloc()吗?
是的,是的,这就是新操作员的重点。
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<