为什么要使用';新';创建具有关联指针的对象时? 我通过阅读教科书来学习C++。“对象和指针”部分说,声明指向如下对象的指针: SomeClass *ptrMyClass; SomeClass *ptrMyClass; ptrMyClass = new SomeClass;

为什么要使用';新';创建具有关联指针的对象时? 我通过阅读教科书来学习C++。“对象和指针”部分说,声明指向如下对象的指针: SomeClass *ptrMyClass; SomeClass *ptrMyClass; ptrMyClass = new SomeClass;,c++,object,pointers,heap,C++,Object,Pointers,Heap,它本身什么也不做。只有在定义类的实例之后,它才有意义,如下所示: SomeClass *ptrMyClass; SomeClass *ptrMyClass; ptrMyClass = new SomeClass; 或者通过将这些结合在一起: SomeClass *ptrMyClass = new SomeClass; 我的问题是,为什么我们必须使用“new”在堆上创建某个类的实例?到目前为止,在这本书中,指针总是指向“正常”变量(如int、float…),这些变量不是使用“new”创建的。

它本身什么也不做。只有在定义类的实例之后,它才有意义,如下所示:

SomeClass *ptrMyClass;
SomeClass *ptrMyClass;
ptrMyClass = new SomeClass;
或者通过将这些结合在一起:

SomeClass *ptrMyClass = new SomeClass;

我的问题是,为什么我们必须使用“new”在堆上创建某个类的实例?到目前为止,在这本书中,指针总是指向“正常”变量(如int、float…),这些变量不是使用“new”创建的。谢谢。

在C++中实例化对象有两种主要方式:堆栈和堆(或免费存储)。例如:

void func()
{
    // On the stack:
    Widget blah;

    // On the heap:
    Widget * foo = new Widget;
    delete foo;
}
堆栈对象/变量的优点是,它们的分配/访问速度往往快一点,使用起来也稍微容易一点。但是,堆栈大小有限,数据通常限于局部范围(全局变量除外,这通常是不可取的)。也就是说,上述示例中的
blah
对象将在
func()
结束时自动销毁。你对此无能为力。因此,当原始项超出范围时,指向堆栈对象/变量的任何指针都将无效(也称为“悬空”)

堆(通常)要大得多,因此它可以处理比堆栈多得多的数据。它倾向于稍微慢一点,但它的优点是允许您在运行时重新分配内容。相反,堆栈对象/变量(尤其是数组)在编译时是固定的

此外,在堆上分配了对象之后,您可以将其保留在堆中,直到您需要它为止,并维护指向它的有效指针。在过去,您最终必须调用
delete
,以避免内存泄漏。在现代C++中,鼓励智能指针(例如:代码> STD::SyrdYPPTR < /C>)。 另一个注意事项是,在声明类的成员时,它会变得稍微复杂一些。如果对象在堆栈上实例化,则其任何直接成员(即组合成员)也将在堆栈上。如果对象在堆上实例化,则其所有成员都将在堆上

为什么我们必须使用“new”在堆上创建某个类的实例

你不必这么做。您还可以引用在堆栈上创建的实例:

SomeClass some;
SomeClass* ptrMyClass(&some);
我的问题是,为什么我们必须使用“new”在堆上创建某个类的实例

你没有。您可以动态创建具有新属性的对象。或者,您可以获取指向现有对象的指针

SomeClass* ptrMyClass1;     // An uninitialized pointer.

                            // If an automatic object its value is indeterminate and
                            // You have not defined what it points at. It should not
                            // be used (until you explicitly set it to something).

                            // If a static object then it is initialized to NULL
                            // i.e. Global (or other static storage duration object).

SomeClass* ptrMyClass2 = new SomeClass; // A pointer to a dynamically 
                                        // allocated object.

SomeClass  objMyClass3;                 // A normal object
SomeClass* ptrMyClass4 = &objMyClass3;  // A pointer to a normal object
为什么要在堆中创建类的实例 有一种情况是你必须做这种事情

当您使用没有具体方法的抽象类,以及从该抽象类继承的类时(在Java或PHP世界中,我们将讨论从
接口
继承):

如果需要通过继承类的抽象类引用继承类的实例,则语法为:

IMyAbstractClass * myInstance;
myInstance = new MyInheritedClass;
那么它允许你做什么呢? 以这种方式声明对象后,可以将其作为IMyAbstractClass的实例传递给另一个对象的构造函数:

AnotherClass anotherObject(myInstance);
此构造函数的编码如下所示:

class AnotherClass
{
public:
    AnotherClass(IMyAbstractClass * instance)
    {
        // doSomething
    }
};
任何地方都有真实的例子?
这种行为在中使用。

您不必这样做。通常你必须避免它。不管怎样,堆栈和堆分配都有其优缺点。@Drop-你的意思是通常我应该避免在堆上创建对象吗?为什么这本书通过创建带有“new”的对象来教授“对象和指针”?必须有一个很好的理由。(1)只有在必要时才使用堆,否则使用堆栈分配。(2) 我们倾向于使用智能指针和STL工具,而不是使用原始
new
/
delete
。(3) 可以在堆栈上分配指向类类型对象的指针,方法与使用
int
时相同。因此,您可以在堆上分配
int
。(4)没有人能知道所有关于C++,甚至Stroustrup。所以没有绝对的书。总是对你所读的东西提出批评。为初学者准备的书经常(过分)简化事情,甚至错误地解释它。没关系,以后您可以随时刷新和重新加载您的知识;)<代码>为什么这本书通过创建带有“new”的对象来教授“objects and pointer”,然后首先想到的是:作者来自C#/Java世界;)