C++ Java程序员想要理解C++;代码:使用对象的方法而不使用新的

C++ Java程序员想要理解C++;代码:使用对象的方法而不使用新的,c++,malloc,new-operator,C++,Malloc,New Operator,我多年来一直在使用Java。现在我需要了解一个C++程序。 TimeStamp theTimeStamp; theTimeStamp.update(); 让我困惑的是我们为什么不写呢 TimeStamp theTimeStamp = new(); 我的直觉是,要使用一个对象,首先应该分配一个内存空间并与该对象关联 我猜这是java和C++基本区别的地方吗?你能澄清一下吗 我写了“TimeStamp theTimeStamp=malloc();” 在您给出的示例中,由于没有传递任何参数,因此

我多年来一直在使用Java。现在我需要了解一个C++程序。
TimeStamp theTimeStamp;
theTimeStamp.update();
让我困惑的是我们为什么不写呢

TimeStamp theTimeStamp = new(); 
我的直觉是,要使用一个对象,首先应该分配一个内存空间并与该对象关联

我猜这是java和C++基本区别的地方吗?你能澄清一下吗


我写了“TimeStamp theTimeStamp=malloc();”

在您给出的示例中,由于没有传递任何参数,因此在没有参数的情况下调用TimeStamp的构造函数以在堆栈上创建新的时间戳。此变量的作用域用完时将被删除(使用新的堆栈帧)

malloc
分配作为参数传递的内存量,并向该大小的块返回一个void*。这个内存是在堆上分配的,当作用域用完时不会被删除,并且必须显式地
free
d


参见C++,但不想使用<代码> Malc C < /C> >代码>免费< /C>,你应该坚持友好的C++变体新的和删除。< /P> < P>你永远不会写<代码>时间戳TimePays= MalCube()C++中的代码> ./P>

首先,因为<代码> MalOC 是C,不应该在C++中使用。其次,它不知道它的上下文,需要一个参数来指定它必须分配多少内存,并返回一个您需要强制转换的非类型指针

相反,你会写信

TimeStamp * theTimeStamp = new TimeStamp();
看,这与Java非常相似。注意那里的
*
?这是为了指定时间戳是指针(在Java中,用户定义类型的每个变量都是指针/引用,所以您不必关心显式声明)

< C++ >中,但是,您可以选择是否需要< /P>
  • C++自动处理变量作用域的创建和销毁(即,不使用
    *
    ,如第一个代码示例所示)。然而,这意味着一旦时间戳超出范围(即通常在定义变量的块的末尾),变量将自动销毁
  • <>或者如果你想自己做动态内存分配(爪哇中的默认情况)——但是与java相反,你也必须关心C++中对象的删除。
<>这是必须注意删除“手动”的原因,在C++中,通常不直接使用这样的原始指针,而是从新的C++ 11标准中,例如所谓的“智能代码指针类型”,例如:代码> STD::SyrdYPPTR < /代码>。它们让您不用再手动执行删除操作(在许多情况下可能会忘记这一点)。还有其他智能指针类型;然而,
shared_ptr
提供了与Java最相似的功能-您可以将一个
shared_ptr
分配给另一个,从而使它指向的对象保持活动状态,并且只有当指向对象的最后一个共享指针被销毁时,指向的对象才会被销毁


无论何时,C++中最好不要使用指针,而是使用自动分配的变量。

< P> <强>自动变量是一个变量,当程序流进入并离开变量的上下文时,它自动分配和释放。 默认情况下,在代码块中声明的所有变量都是自动的

所以当流量达到

时间戳时间戳

它使用默认构造函数在堆栈上自动分配此对象。当流到达
}

您还可以使用动态内存进行分配:

TimeStamp *theTimeStamp = new TimeStamp(); //calling default constructor
删除时间戳手动


永远不要使用malloc或free来分配类变量(对象)。

这样想。在java中,当需要int时,不需要这样做

int i = new int(5);
i++;
是吗

int i = 5;
i++;
在Java中,原语和对象是有区别的。原语在堆栈上分配,没有新的,并在作用域结束时销毁。对象被分配新的,并被垃圾回收


C++中的每个类默认都是一个原始的。它在堆栈上创建,并在作用域结束时销毁。您可以通过编写构造函数和析构函数来控制创建和销毁时发生的事情。现在,只要变量受范围限制,这种方法就非常有效。如果不是这样,您可以使用new(旧样式)或make_unique/make_shared(现代样式)在堆上分配类的对象。

@zell
时间戳包括分配和对象构造<代码>时间戳本身在硬件堆栈上分配。如果你想在免费商店里买到这个东西,你可以使用
new
。@zell:人们都是白痴,现在投票否决任何问题,只是因为你还不知道答案。我会忽略它。@LightnessRacesinOrbit也许这与询问malloc有关。这表明研究工作很少。不过,在C++中有一个完全不同的对象模型。java中有一个完全不同的对象模型。在C++中,变量是无约束的,变量可以是对象。(但不是每个变量都是对象,对象也不一定是变量。)这是语言的基础,应该包含在任何一本优秀的初学者教科书中。(相比之下,java变量(非原始类型)永远不是对象)。C++中的KerrekSB,每个变量都是对象(但不是所有对象都是变量)。这是C++和java之间的基本区别之一:在java中,“对象”必须动态分配,变量不是对象,也有特殊类型,它们也不是对象。在C++中,你没有所有这些区别:实际上,EVE